我有这样的数据框:
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
答案 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