我在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
是否有能够做到这一点的功能? 谢谢你的帮助!!!!
答案 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.table
(setDT(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)