Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 按重复列拆分数据帧_R - Fatal编程技术网

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