2016-08-01 5 views
0

Ich habe einen Datensatz wie diese (df1)Wie kann ich meinen Datenrahmen effizienter in ein neues Formular (R) umformen?

ID 2 4 6 8 10 12 14 16 18 20 22 24 Day 
1 0 0 0 0 2 0 0 0 1 0 1 0 Sunday 
1 0 0 0 0 0 4 0 0 0 0 0 0 Monday 
1 0 0 0 0 0 0 0 0 2 0 0 0 Tuesday 
1 0 0 0 0 0 0 2 0 0 0 0 0 Wednesday 
1 0 0 0 0 0 0 0 2 0 0 0 0 Thursday 
1 0 0 0 0 0 0 0 0 2 0 0 0 Friday 
1 0 0 0 0 0 0 0 0 0 2 0 0 Saturday 
2 0 0 0 0 0 0 0 0 0 0 0 0 Sunday 
2 0 0 0 0 0 1 0 0 0 0 0 0 Monday 
2 0 0 0 0 0 0 1 0 0 0 1 0 Tuesday 
2 0 0 0 0 0 0 0 1 0 0 0 0 Wednesday 
2 0 0 0 0 0 0 0 0 1 0 0 0 Thursday 
2 0 0 0 0 0 2 0 0 0 1 0 0 Friday 
2 0 0 0 0 0 0 0 0 0 0 0 0 Saturday 
3 0 0 0 0 0 0 0 0 0 0 0 0 Sunday 
3 0 0 0 0 0 0 2 0 0 0 0 0 Monday 
3 0 0 0 0 0 1 0 0 2 0 0 0 Tuesday 
3 0 0 0 0 0 0 0 0 0 0 0 0 Wednesday 
3 0 0 0 0 0 0 0 2 0 0 0 0 Thursday 
3 0 0 0 0 0 0 0 0 0 0 0 0 Friday 
3 0 0 0 0 0 0 2 0 0 0 0 0 Saturday 
3 0 0 0 0 0 0 0 2 0 0 0 0 Sunday 

und ich habe eine ID Checkliste wie folgt aus:

ID 
1 
2 
3 

Ich möchte die df1 in diese Art von Ausgabe konvertieren:

ID Var1 Var2 Var3 Var4 Var5 ...... Var82 Var83 Var84 
1 0   0  0   0  2    2  0  0 
2 
3 

Dabei steht Var1 'Sonntag 2' (im ersten Datenrahmen) und var84 repräsentiert der "Samstag24". Ich möchte mein Ergebnis als .csv Datei exportieren.

Ich mache dies mit einer for-Schleife (siehe unten), weil es zu viele IDs gibt. Das Problem ist jedoch, dass diese Codes sehr langsam laufen. Gibt es einen schnelleren Weg, um das gleiche Ergebnis zu erhalten?

library(dplyr) 
library(reshape2) 
for (i in ID_checklist$ID) { 

    x= filter(df1$ID %in% i) 
    x$Day = NULL 
    df.melted = melt(t(x[,-1]), id.vars = NULL) 
    myNewDF = data.frame(i, t(df.melted[,3])) 
    write.table(myNewDF,file="my12x7.csv", append=TRUE,sep=",",col.names=FALSE,row.names=FALSE) 
} 

Antwort

0

Ich denke, das ist das, was Sie wollen:

library(reshape2) 

# this may be unnecessary depending on your data 
# it will make sure the weekday columns come in the same order 
# as the weekdays appear in your original data 
df1$Day = factor(df1$Day, levels = unique(df1$Day)) 

# convert to a fully long format 
df_long = melt(df1, id.var = c("ID", "Day")) 

# convert to the wide format you want 
result = dcast(data = df_long, ID ~ Day + variable, fun.aggregate = sum) 

Dies wird den Tag-Namen mit den aktuellen Variable anhängen. Wenn Sie sie lieber als Var1 Var2 Var3 haben möchten, verwenden Sie paste() und benennen Sie die Spalten um.

Wir bei den ersten paar Spalten schauen, um zu überprüfen:

result[, 1:6] 
# ID Sunday_X2 Sunday_X4 Sunday_X6 Sunday_X8 Sunday_X10 
# 1 1   0   0   0   0   2 
# 2 2   0   0   0   0   0 
# 3 3   0   0   0   0   0