我有一个包含以下列的巨大数据框(还有一些,但这些并不重要)。这是一个例子:
user_id video_id group_id x y
1 1 0 0 39 108
2 1 0 0 39 108
3 1 10 0 135 180
4 2 0 0 20 123
用户,视频和群组ID当然是因素。例如,有20个视频,但每个视频对每个用户和组都有几个“观察”。
我想将此数据框转换为以下格式,其中有x.N
,y.N
与用户(N
)一样多。
video_id x.1 y.1 x.2 y.2 …
0 39 108 20 123
因此,对于视频0
,来自用户1的x和y值分别位于x.1
和y.1
列中。对于用户2,其值位于x.2
,y.2
列中,依此类推。
我自己制作了一个数据框列表,这些数据框完全由每个x, y
的{{1}}个观察结果组成:
video_id
这就是它的样子:
summaryList = dlply(allData, .(user_id), function(x) unique(x[c("video_id","x","y")]) )
剩下要做的是:
根据 List of 15
$ 1 :'data.frame': 20 obs. of 3 variables:
..$ video_id: Factor w/ 20 levels "0","1","2","3",..: 1 11 8 5 12 9 20 13 7 10 ...
..$ x : int [1:20] 39 135 86 122 28 167 203 433 549 490 ...
..$ y : int [1:20] 108 180 164 103 187 128 185 355 360 368 ...
$ 2 :'data.frame': 20 obs. of 3 variables:
..$ video_id: Factor w/ 20 levels "0","1","2","3",..: 2 14 15 4 20 6 19 3 13 18 ...
..$ x : int [1:20] 128 688 435 218 528 362 299 134 83 417 ...
..$ y : int [1:20] 165 117 135 179 96 328 332 563 623 476 ...
将summaryList
中的每个数据框相互合并。我找不到一种很好的方法来访问列表中的实际数据帧,video_id
,summaryList[1]$`1`
等等。
@James找到了部分解决方案:
summaryList[2]$`2`
确保在用户ID之后重命名列名称,而不是保持原样。现在我的Reduce(function(x,y) merge(x,y,by="video_id"),summaryList)
不包含有关用户ID的任何信息,summaryList
的输出有重复的列名,如Reduce
等等。
我该怎么做呢?或者有没有比我目前正在做的更简单的方法来获得结果?
答案 0 :(得分:4)
我仍然有些困惑。但是,我想您只想melt
和dcast
。
library(reshape2)
d <- melt(allData,id.vars=c("user_id","video_id"), measure.vars=c("x","y"))
dcast(d,video_id~user_id+variable,value.var="value",fun.aggregate=mean)
导致:
video_id 1_x 1_y 2_x 2_y 3_x 3_y 4_x 4_y 5_x 5_y 6_x 6_y 7_x 7_y 8_x 8_y 9_x 9_y 10_x 10_y 11_x 11_y 12_x 12_y 14_x 14_y 15_x 15_y 16_x 16_y
1 0 39 108 899 132 61 357 149 298 1105 415 148 208 442 200 210 134 58 244 910 403 152 52 1092 617 1012 114 1105 424 548 394
2 1 1125 70 128 165 1151 390 171 587 623 623 80 643 866 310 994 114 854 129 781 306 672 -1 1096 354 525 524 150
答案 1 :(得分:3)
Reduce
可以解决问题:
reducedData <- Reduce(function(x,y) merge(x,y,by="video_id"),summaryList)
...但您需要事后修复names
:
names(reducedData)[-1] <- do.call(function(...) paste(...,sep="."),expand.grid(letters[24:25],names(summaryList)))
结果是:
video_id x.1 y.1 x.2 y.2 x.3 y.3 x.4 y.4 x.5 y.5 x.6 y.6 x.7 y.7 x.8
1 0 39 108 899 132 61 357 149 298 1105 415 148 208 442 200 210
2 1 1125 70 128 165 1151 390 171 587 623 623 80 643 866 310 994