【问题标题】:Why does data.table::B[A] and plyr::join(A,B) return different results?为什么 data.table::B[A] 和 plyr::join(A,B) 返回不同的结果?
【发布时间】:2019-11-04 10:25:42
【问题描述】:

我在 R 中有 2 个数据表

A <- data.table(a = 1:4, b = 12:15)
B <- data.table(a = 2:3, b = 13:14)

使用时

C<-plyr::join(A,B)

返回

   a  b
1: 1 12
2: 2 13
3: 3 14
4: 4 15

当我使用时

setkey(A, "a")
setkey(B, "a")
B[A]

返回

   a  b i.b
1: 1 NA  12
2: 2 13  13
3: 3 14  14
4: 4 NA  15

为什么两个函数的结果不同? plyr 正在对所有匹配的变量应用左连接。 Data.table 也在做同样的事情吗? 我们如何使用 'data.table' 实现 'plyr' 给出的结果?

【问题讨论】:

  • 因为当你没有在joins中定义by参数时,它会连接所有的公共列。在您的情况下,ab。一旦你设置了一个键,你只在键的列上合并...

标签: r data.table plyr


【解决方案1】:

使用 data.table 版本 >= 1.12.4,您可以使用 on=.NATURAL(请参阅标题为 data.table v1.12.4(2019 年 10 月 3 日)here 部分下的新闻项目 10)

library(data.table) #above and incl data.table_1.12.4
A <- data.table(a = 1:4, b = 12:15)
B <- data.table(a = 2:3, b = 13:14)
B[A, on=.NATURAL]

输出:

   a  b
1: 1 12
2: 2 13
3: 3 14
4: 4 15

【讨论】:

    【解决方案2】:

    plyr 使用两个(所有)列进行连接,data.table 仅使用键控的a 列。

    设置相同的键,结果是一样的,见:

    setkeyv(A, c("a", "b"))
    setkeyv(B, c("a", "b"))
    B[A]
    #    a  b
    # 1: 1 12
    # 2: 2 13
    # 3: 3 14
    # 4: 4 15
    

    【讨论】:

      【解决方案3】:

      这是另一个data.table 选项:

      B[A, .(a, b = i.b)]
      
         a  b
      1: 1 12
      2: 2 13
      3: 3 14
      4: 4 15
      

      【讨论】:

        猜你喜欢
        • 2020-04-13
        • 2014-03-29
        • 2021-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-26
        • 2011-05-30
        • 1970-01-01
        相关资源
        最近更新 更多