R 按重复列拆分数据帧
我有这样的数据框:R 按重复列拆分数据帧,r,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
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
如何拆分数据帧,以便获得如下数据帧:
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
您可以尝试使用
base R
中的重塑
,也可以使用其他软件包。在第一步中,我们将创建一个indx
列以进行分组。您可以使用ave
为每组p3
创建一个序列
,即对于前两个元素(p3=1
),相应的indx
将为1,2
,对其余组也会这样做。在indx
创建步骤之后,您可以直接使用重塑
并将方向指定为宽
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
或使用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
library(dplyr)
library(tidyr)
gather(df1, Var, Val, p1:p2) %>%
unite(p3Var, p3, Var) %>%
spread(p3Var,Val, fill=0)
# 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.3480860 -1.3496633 -0.5271080 -0.1030045 0.8642336
#3 3 0.0000000 0.0000000 0.0000000 0.0000000 0.5839070 -0.9723264
@akrun只是一个输入错误。你能更详细地解释第一次尝试吗?@Trik23我给它添加了一些文字。希望有帮助。@Ananda Mahto谢谢,你在之前的帖子中给我看了getanID
。@akrun非常感谢@Trik23正如我在帖子中所展示的,您可以在dcast
或排列中使用fill=0
。否则,如果res
是结果,res[is.na(res)]