将列表中的数据框相互合并

slh*_*hck 5 merge r plyr dataframe

我需要的:

我有一个巨大的数据框,包含以下列(还有一些,但这些并不重要).这是一个例子:

    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
Run Code Online (Sandbox Code Playgroud)

当然,用户,视频和组ID是因素.例如,有20个视频,但每个视频对每个用户和组都有几个"观察".

我想该数据帧变换成以下格式,其中有许多x.N,y.N因为有用户(N).

video_id  x.1   y.1  x.2  y.2  …
       0   39   108   20  123
Run Code Online (Sandbox Code Playgroud)

因此,对于视频0,从用户1的x和y值在列x.1y.1分别.对于用户2,它们的值在列中x.2,y.2等等.

我尝试过的:

我自己制作了一个数据框列表,这些框架完全由x, y每个观察结果组成video_id:

summaryList = dlply(allData, .(user_id), function(x) unique(x[c("video_id","x","y")]) )
Run Code Online (Sandbox Code Playgroud)

这就是它的样子:

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 ...
Run Code Online (Sandbox Code Playgroud)

我被困在哪里:

剩下要做的是:

  • 合并从每个数据帧summaryList彼此的基础上,video_id.我不能找到一个很好的方式来访问列表中的实际数据帧,这是summaryList[1]$`1`,summaryList[2]$`2`,等等.

    @James找到了部分解决方案:

    Reduce(function(x,y) merge(x,y,by="video_id"),summaryList)
    
    Run Code Online (Sandbox Code Playgroud)
  • 确保在用户标识之后重命名列名称,而不是保持原样.现在我summaryList不包含任何有关用户ID的信息,并且输出Reduce具有重复的列名x.x y.x x.y y.y x.x y.x等等.

我该怎么做呢?或者,有什么比我目前正在做的更简单的方法来获得结果?

Jam*_*mes 3

Reduce诀窍是:

\n\n
reducedData <- Reduce(function(x,y) merge(x,y,by="video_id"),summaryList)\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xe2\x80\xa6 但您需要names随后修复:

\n\n
names(reducedData)[-1] <- do.call(function(...) paste(...,sep="."),expand.grid(letters[24:25],names(summaryList)))\n
Run Code Online (Sandbox Code Playgroud)\n\n

结果是:

\n\n
   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\n1         0   39 108  899 132   61 357  149 298 1105 415  148 208  442 200  210\n2         1 1125  70  128 165 1151 390  171 587  623 623   80 643  866 310  994\n
Run Code Online (Sandbox Code Playgroud)\n