r - 相互合并列表中的数据帧

标签 r merge dataframe plyr

我需要的:

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

    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.Ny.N和用户数(N)一样多。
video_id  x.1   y.1  x.2  y.2  …
       0   39   108   20  123

因此,对于视频0,来自用户1的x和y值分别位于x.1y.1列中。对于用户2,其值在x.2y.2列中,依此类推。

我尝试过的

我为自己创建了一个数据帧列表,这些数据帧完全由每个x, y的所有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`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可以解决这个问题:

    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
    

    关于r - 相互合并列表中的数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13953443/

    相关文章:

    python - Pandas :分配具有多个条件和日期阈值的列

    r - 从 data.frame 创建二进制矩阵

    r - ggplot2:更改 `color`的顺序

    r - ggplot2 geom_line() 和平滑

    r - 在 R 中现有间隔之间添加缺失间隔的行

    android - 如何在 Android 中合并两个或多个适配器并显示在一个 ListView 中

    r - 如何在 dplyr 中使用或/和对 data.frame 进行子集化

    algorithm - 自上而下的范围合并?

    python - 如何在一个表达式中合并两个字典(合并字典)?

    python - 从 .csv 文件中提取数值