【问题标题】:How to join a data.table with multiple columns and multiple values如何连接具有多列和多个值的 data.table
【发布时间】:2014-09-01 15:12:59
【问题描述】:

这里有一个例子:

DT = data.table(x=1:4, y=6:9, z=3:6)
setkey(DT, x, y)

连接列有多个值:

xc = c(1, 2, 4)
yc = c(6, 9)
DT[J(xc, yc), nomatch=0]
   x y z
1: 1 6 3

J() 的这种使用只返回单行。其实我想加入%in%运营商。

DT[x %in% xc & y %in% yc]
   x y z
1: 1 6 3
2: 4 9 6

但是使用%in% 运算符使搜索成为矢量扫描,与二进制搜索相比,它非常慢。为了进行二分搜索,我构建了所有可能的连接值组合:

xc2 = rep(xc, length(yc))
yc2 = unlist(lapply(yc, rep, length(xc)))
DT[J(xc2, yc2), nomatch=0]
   x y z
1: 1 6 3
2: 4 9 6

但是以这种方式构建 xc2、yc2 会使代码难以阅读。在这种情况下,有没有更好的方法来获得二分查找的速度和%in% 运算符的简单性?

【问题讨论】:

  • 我认为您正在寻找 cross join - 这是函数 CJ。试试DT[CJ(xc,yc), nomatch=0L]。随意发布这个作为答案(如果正确)并接受它。

标签: r performance data.table binary-search


【解决方案1】:

回答从 DT 标记开放问题中删除此问题。
来自 Arun 评论 DT[CJ(xc,yc), nomatch=0L] 的代码将完成这项工作。

【讨论】:

    猜你喜欢
    • 2019-11-03
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 2013-08-05
    • 1970-01-01
    • 2016-07-20
    • 2017-09-25
    相关资源
    最近更新 更多