2016-08-01 4 views
0

У меня есть набор данных, как это (df1)Как более эффективно преобразовать мою фреймворк в новую форму (R)?

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 

и у меня есть ID контрольный список, как это:

ID 
1 
2 
3 

Я хочу, чтобы преобразовать df1 в этот вид продукции:

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

, где Var1 представляет «воскресенье 2» (в первом кадре данных), а var84 представляет «суббота24». Я хочу экспортировать мой результат как файл .csv.

Я делаю это, используя цикл for (показано ниже), потому что слишком много идентификаторов. Однако проблема в том, что эти коды работают очень медленно. Есть ли более быстрый способ получить тот же результат?

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) 
} 

ответ

0

Я думаю, что это то, что вы хотите:

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) 

Это будет добавлять названия дней с текущей переменной. Если вы предпочитаете использовать их как Var1 Var2 Var3, используйте paste() и переименуйте столбцы.

Мы можем посмотреть на первые несколько столбцов, чтобы проверить:

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