【问题标题】:Merging tables that are sorted differently with R使用 R 合并以不同方式排序的表
【发布时间】:2011-04-22 14:26:03
【问题描述】:

我有两张大桌子。一个带有标识符(未排序),另一个带有标识符列表(包含第一个表中的所有标识符)以及一个变量的关联值。 我想在我的第一个表中添加一列,其中包含第二个表中的关联值。有没有一种聪明的方法可以继续使用 R 的实现功能?

table 1
id
8979786
62782
6268768
6776566

table 2
id        var
1          5
2          2
3          NA
…
9999999    6

结果应该是

table1
id       var
8979786   5
62782     NA
6268768   7
4776566   4

提前致谢

【问题讨论】:

    标签: r dataframe merging-data


    【解决方案1】:

    所以id 列在两个表中?你可以merge他们一起:merge(table1, table2, sort = FALSE)。有许多可供探索的合并选项可让您模拟不同类型的连接,类似于 SQL 中的内、左、右和外连接。我在此处添加了附加参数sort,以保留table1的原始顺序。

    如果表 1 中有 id 而表 2 中没有 id,并且您想为它们显示 NA,请添加 all.x = TRUE 作为参数。这相当于左连接。 all.y 是右连接,all = TRUE 相当于完全外连接。

    可重现的例子:

    > set.seed(1)
    > table1 <- data.frame( id = sample(1:5, 5, FALSE))
    > table1
      id
    1  2
    2  5
    3  4
    4  3
    5  1
    > table2 <- data.frame( id = 1:5, var = rnorm(5))
    > table2
      id        var
    1  1  1.2724293
    2  2  0.4146414
    3  3 -1.5399500
    4  4 -0.9285670
    5  5 -0.2947204
    > merge(table1, table2, sort = FALSE)
      id        var
    1  2  0.4146414
    2  5 -0.2947204
    3  4 -0.9285670
    4  3 -1.5399500
    5  1  1.2724293
    

    【讨论】:

    • table2[match(table1$id,table2$id),] 甚至只是 table2[table1$id,] 如果 id 真的从 1 变为 n。
    • merge generalises to more id columns than match.
    【解决方案2】:

    这是一种执行此操作的 data.table 方式,以防数据很大且速度成为问题。更多信息请参考?data.table的帮助页面:

    当 i 是 data.table 时,x(即外部 data.table)必须有一个 钥匙。 i(即内部 data.table)使用键连接到 x 和 返回 x 中匹配的行。执行等值连接 在 i 中的每一列到 x 的键中的每一列之间。比赛是一场 在 O(log n) 时间内在编译的 C 中进行二进制搜索。如果我有更少的列 比 x 的键,那么 x 的许多行可能与 i 的每一行匹配。如果我有 列多于 x 的键,i 的列不参与 join 包含在结果中。如果我也有钥匙,那就是我的钥匙 用于匹配 x 的键列和二进制合并的列
    执行两个表中的一个。

    请注意,我稍微调整了 Chase 提供的示例数据,以使 data.table 中的某些匹配点更加明显:

    require(data.table)
    #Version 1.7.7
    set.seed(1)
    table1 <- data.table(id = sample(3:7, 5, FALSE), var1 = rnorm(5), key="id")
    table2 <- data.table(id = 5:10, var2 = rnorm(6), key="id")
    
    #Default: If id in table 1 is not in table 2, return NA
    table2[table1]
    #      id         var2       var1
    # [1,]  3           NA -0.2947204
    # [2,]  4           NA  1.2724293
    # [3,]  5 -0.005767173 -0.9285670
    # [4,]  6  2.404653389 -1.5399500
    # [5,]  7  0.763593461  0.4146414
    
    #If one wants to get rid of the NAs
    table2[table1, nomatch=0]
    #      id         var2       var1
    # [1,]  5 -0.005767173 -0.9285670
    # [2,]  6  2.404653389 -1.5399500
    # [3,]  7  0.763593461  0.4146414
    
    #Or the other way around: get all ids of table 2
    table1[table2]
    #      id       var1         var2
    # [1,]  5 -0.9285670 -0.005767173
    # [2,]  6 -1.5399500  2.404653389
    # [3,]  7  0.4146414  0.763593461
    # [4,]  8         NA -0.799009249
    # [5,]  9         NA -1.147657009
    # [6,] 10         NA -0.289461574
    

    强制性速度测试:

    set.seed(10)
    df1 <- data.frame(id = sample(1:5e6, 5e6, FALSE))
    df2 <- data.frame(id = sample(1:5e6, 5e6, FALSE), var = rnorm(5e6))
    system.time(df_solution <- merge(df1, df2, sort = TRUE))
    #    user  system elapsed 
    #   33.10    0.32   33.54
    merge_dt <- function(df1, df2) {
      dt1 <- setkey(as.data.table(df1), "id")
      dt2 <- setkey(as.data.table(df2), "id")
      return(dt1[dt2])
    }
    system.time(dt_solution <- merge_dt(df1, df2))
    #    user  system elapsed 
    #   12.94    0.01   12.95 
    all.equal(df_solution, as.data.frame(dt_solution))
    #[1] TRUE
    

    还有我一贯的免责声明:我还在学习很多关于这个包的知识,所以你可以在package homepage找到更好的信息。

    【讨论】:

      【解决方案3】:

      我刚刚实现了一个解决这个问题的函数(合并两个 data.frame 对象,同时保持两个对象之一的顺序),您可以在此处查看其使用的代码和示例:

      http://www.r-statistics.com/2012/01/merging-two-data-frame-objects-while-preserving-the-rows-order/

      【讨论】:

      • 嗨,塔尔。请不要忘记 data.table。
      • 抱歉 Matthew :) 邀请您在此处(或在我的帖子中)发表评论,了解如何使用 data.table 解决此问题!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-15
      • 1970-01-01
      • 1970-01-01
      • 2012-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多