通过重复列拆分数据框

时间:2014-11-04 10:59:15

标签: r

我有这样的数据框:

p1=rnorm(7)
p2=rnorm(7)
p3=c(1,1,2,2,3,3,3)

df=data.frame(p1,p2,p3)


df

         p1         p2 p3
1 -0.7843568  0.6383588  1
2 -0.4073465  0.3480860  1
3  0.2799414 -0.1938586  2
4 -1.3496633 -0.5271080  2
5 -1.5750376  0.6178624  3
6 -0.1030045  0.8642336  3
7  0.5839070 -0.9723264  3

如何拆分数据框,以便我可以拥有如下数据框:

        1         1           2          2             3        3
1 -0.7843568  0.6383588   0.2799414 -0.1938586  -1.5750376   0.6178624 
2 -1.3496633 -0.5271080  -0.4073465  0.3480860   -0.1030045  0.8642336
3                                                0.5839070  -0.9723264

1 个答案:

答案 0 :(得分:3)

您可以尝试使用reshape中的base R或使用其他套餐。在第一步中,我们创建了一个indx列,用于分组目的。您可以使用ave为每组sequence创建p3,即对于前两个元素(p3=1),相应的indx将为{ {1}}并且它对其余组也是如此。在1,2创建步骤后,您可以直接使用indx并将reshape指定为direction

wide

或者您可以使用df1 <- transform(df, indx=ave(p3,p3, FUN=seq_along)) reshape(df1, idvar='indx', timevar='p3', direction='wide') # indx p1.1 p2.1 p1.2 p2.2 p1.3 p2.3 #1 1 -0.7843568 0.6383588 0.2799414 -0.1938586 -1.5750376 0.6178624 #2 2 -0.4073465 0.3480860 -1.3496633 -0.5271080 -0.1030045 0.8642336 #7 3 NA NA NA NA 0.5839070 -0.9723264 中的getanID生成splitstackshape列,并将其与indx

组合使用
reshape

或使用library(splitstackshape) reshape(getanID(df, 'p3'), direction='wide', idvar='.id', timevar='p3') # .id p1.1 p2.1 p1.2 p2.2 p1.3 p2.3 #1: 1 -0.7843568 0.6383588 0.2799414 -0.1938586 -1.5750376 0.6178624 #2: 2 -0.4073465 0.3480860 -1.3496633 -0.5271080 -0.1030045 0.8642336 #3: 3 NA NA NA NA 0.5839070 -0.9723264 。您可以指定dcast/melt参数。默认值为fill。在这里,我使用NA,但它会将列类转换为字符。

''

或使用library(reshape2) dcast(melt(df1, id.var=c('p3','indx')), indx~p3+variable, value.var='value', fill='') # indx 1_p1 1_p2 2_p1 2_p2 3_p1 3_p2 #1 1 -0.7843568 0.6383588 0.2799414 -0.1938586 -1.5750376 0.6178624 #2 2 -0.4073465 0.348086 -1.3496633 -0.527108 -0.1030045 0.8642336 #3 3 0.583907 -0.9723264

tidyr