将R中变量具有相同值的行组合在一起

时间:2015-08-11 17:39:48

标签: r

我在R中创建了以下数据框:

V1 <- c(1,3,2,6,7,7,5,3,1,1)
V2 <- c("rot", "grün", "grün", "gelb", "blau", "rot", "grün", "blau",    
"blau", "schwarz")
V3 <- c(44,23,28,23,88,88,44,28,11,44)
as.data.frame(cbind(V1,V2,V3) )

   V1      V2 V3
1   1     rot 44
2   3    grün 23
3   2    grün 28
4   6    gelb 23
5   7    blau 88
6   7     rot 88
7   5    grün 44
8   3    blau 28
9   1    blau 11
10  1 schwarz 44

V3是我想用来重新排列数据集的变量。 结果应该是一个数据框,其中包含V3的每个值的行,以及同一行中其他变量的信息。

对于这个例子,我想要的是这样的:

V3  V1.1  V2.1  V2.1  V2.2  V1.3  V2.3

11  1     blau   NA    NA    NA    NA
23  3     grün    6   gelb   NA    NA
28  2     grün    3   blau   NA    NA
44  1     rot     5   grün    1   schwarz
88  7     blau    7   rot    NA    NA

是否有能够做到这一点的功能? 谢谢你的帮助!!!!

2 个答案:

答案 0 :(得分:6)

reshape(transform(df,time=ave(seq_len(nrow(df)),V3,FUN=seq_along)),dir='w',idvar='V3');
##   V3 V1.1 V2.1 V1.2 V2.2 V1.3    V2.3
## 1 44    1  rot    5 grün    1 schwarz
## 2 23    3 grün    6 gelb <NA>    <NA>
## 3 28    2 grün    3 blau <NA>    <NA>
## 5 88    7 blau    7  rot <NA>    <NA>
## 9 11    1 blau <NA> <NA> <NA>    <NA>

答案 1 :(得分:2)

以下是使用$filter('myFilter')(argument 1); 的开发版dcast中的data.table的一个选项。

我们将data.frame转换为data.tablesetDT(df1))。创建一个序列列&#39; indx&#39;基于分组变量&#39; V3&#39;和dcast来自&#39; long&#39;广泛的&#39;。在devel版本中,dcast可以使用多个value.var列。

library(data.table)#v1.9.5+
setDT(df1)[, indx:=1:.N, V3]#create sequence variable
dcast(df1, V3~indx, value.var=c('V1', 'V2'), sep=".")
#    V3 V1.1 V1.2 V1.3 V2.1 V2.2    V2.3
#1: 11    1   NA   NA blau   NA      NA
#2: 23    3    6   NA grün gelb      NA
#3: 28    2    3   NA grün blau      NA
#4: 44    1    5    1  rot grün schwarz
#5: 88    7    7   NA blau  rot      NA

注意:安装devel版本的说明是here

可以使用getanID中的splitstackshape以更紧凑的方式创建序列变量。

 library(splitstackshape)
 dcast(getanID(df1, 'V3'), V3~.id, value.var=c('V1', 'V2'))
 #   V3 V1_1 V1_2 V1_3 V2_1 V2_2    V2_3
 #1: 11    1   NA   NA blau   NA      NA
 #2: 23    3    6   NA grün gelb      NA
 #3: 28    2    3   NA grün blau      NA
 #4: 44    1    5    1  rot grün schwarz
 #5: 88    7    7   NA blau  rot      NA

数据

 df1 <- data.frame(V1, V2, V3)