【发布时间】:2012-12-06 20:49:27
【问题描述】:
我需要什么:
我有一个巨大的数据框,其中包含以下列(还有一些,但这些并不重要)。这是一个例子:
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 等列中。
我尝试过的:
我为自己制作了一个数据框列表,这些数据框仅由每个 video_id 的所有 x, y 观察组成:
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 ...
我被困在哪里:
剩下要做的是:
-
基于video_id,将summaryList中的每个数据框相互合并。我找不到访问列表中实际数据帧的好方法,它们是summaryList[1]$`1`、summaryList[2]$`2`等等。@James 找到了部分解决方案:
Reduce(function(x,y) merge(x,y,by="video_id"),summaryList) 确保在用户 ID 之后重命名列名,而不是保持原样。现在我的
summaryList不包含有关用户ID 的任何信息,Reduce的输出有重复的列名,如x.x y.x x.y y.y x.x y.x等等。
我该怎么做呢?或者有没有比我目前正在做的更简单的方法来获得结果?
【问题讨论】:
-
您能否提供一部分数据?我在想
Reduce(function(x,y) merge(x,y,by="video_id"),summaryList)可能会成功 -
您能否提供一个(简化的)您的输入 data.frame 示例和预期输出?我很难理解你想要做什么。
-
@Roland 我添加了一个小例子。这是the whole dataset以防万一。
-
@James 这几乎有效,只有列是
video_id x.x y.x x.y y.y x.x y.x等,所以不以用户ID命名。 -
@slhck 之后尝试使用
names(reducedData)[-1] <- do.call(function(...) paste(...,sep="."),expand.grid(letters[24:25],names(summaryList)))。