在R中以特定方式重塑df

时间:2016-07-12 15:15:31

标签: r dataframe reshape

我正在努力将这个df重新塑造成另一个,我有这个:

   ID task mean  sd mode
1  0    2   10 1.5  223
2  0    2   21 2.4  213
3  0    2   24 4.3  232
4  1    3   26 2.2  121
5  1    3   29 1.3  433
6  1    3   12 2.3  456
7  2    4   45 4.3  422
8  2    4   67 5.3  443
9  2    4   34 2.1  432

我想以这种方式重塑它,放弃sdmode并将mean放在这样的行中:

   ID task mean mean1 mean2
1  0    2   10    21    24
2  1    3   26    29    12
3  2    4   45    67    34

非常感谢您的帮助

2 个答案:

答案 0 :(得分:0)

您需要首先创建一个新列,我们可以通过它来转动mean值。使用data.table,这种方法有效:

library(data.table)
dt <- data.table(df) # Convert to data.table

dcast(dt[,nr := seq(task),
         .(ID)], 
      ID + task ~ nr,
      value.var = "mean")
#   ID task  1  2  3
#1:  0    2 10 21 24
#2:  1    3 26 29 12
#3:  2    4 45 67 34

因此,您始终可以将列重命名为您希望它们调用的列。

答案 1 :(得分:0)

reshape(cbind(df,time=ave(df$ID,df$ID,FUN=seq_along)),dir='w',idvar=c('ID','task'),drop=c('sd','mode'),sep='');
##   ID task mean1 mean2 mean3
## 1  0    2    10    21    24
## 4  1    3    26    29    12
## 7  2    4    45    67    34

数据

df <- data.frame(ID=c(0L,0L,0L,1L,1L,1L,2L,2L,2L),task=c(2L,2L,2L,3L,3L,3L,4L,4L,4L),mean=c(
10L,21L,24L,26L,29L,12L,45L,67L,34L),sd=c(1.5,2.4,4.3,2.2,1.3,2.3,4.3,5.3,2.1),mode=c(223L,
213L,232L,121L,433L,456L,422L,443L,432L));