【问题标题】:quick SQL Join-like adding columns to a data.table in R快速 SQL Join-like 将列添加到 R 中的 data.table
【发布时间】:2015-06-19 09:04:42
【问题描述】:

我想要实现的目标类似于 SQL

select *
from T left join
     T2 on T1.key2 = T2.key2
     left join T3 on T1.key3 = T3.key3

但在 R 中使用 data.table。具体来说,将 T2 中的 两个 列和 T3 中的 一个 列“追加”到第一个表。
我目前的解决方案看起来像

setkey(t1,key2)
t1 <- t2[t1]
setkey(t1,key3)
t1 <- t3[t1]
setkey(t1,key1) # restore the original key

这会复制整个 t1 两次并且不会太快。在“内部”t1 是一个相当大的数据集 ~ 100 万行,t2 和 t3 只是小的“映射”表。
我认为使用 J(..) 可能会有所帮助,但我是 data.tables 的新手,无法真正理解如何在此处应用它。
有人可以建议一个更快的加入解决方案吗?谢谢

【问题讨论】:

  • 您能否展示一个具有所需输出的可重现示例?我怀疑你正在寻找类似 @​​987654321@ 的敌人
  • 是的,这与我正在寻找的非常接近。一个具体的 - 是否有必要 setkey(dt1) 来实现这一目标?设置密钥会在内存中重新排序 data.table,对吧?
  • 是的,但是设置一个键非常有效,即使在 1e8 行数据集上也只需不到一秒的时间。此外,在二元连接之后,您不会丢失密钥,例如DT &lt;- data.table(A = letters[1:4]) ; DT2 &lt;- data.table(A = letters[1:3]) ; setkey(DT, A) ; DT[DT2, B := i.A] ; key(DT)。因此,您只需设置一次即可继续加入其他表。
  • David 为t1[t2, col1 := i.col1] 提到的语法应该允许您根本不复制整个t1。如果它解决了您的问题,您可以自行回答您的问题。这在实施时也可能会有所帮助:data.table#1130
  • 另外,dt1[dt2, col1 := i.col1] 创建列。即当我在加入后运行ls(dt1) 时没有col1。可能对 t2 进行键控还有其他要求吗?

标签: sql r data.table


【解决方案1】:

由于 devel version of data.table, v1.9.5 最近实现了能够直接加入 data.tables 的功能,而无需使用新的 on 参数设置键,我可以为您的问题提供高质量的答案:

t1[t2, colT2 := i.colT2, on = c(key2="key2")
   ][t3, colT3 := i.colT3, on = c(key3="key3")
     ][]

它还应该保留t1 上的原始密钥。

【讨论】:

  • 我想这对大多数人都有效,但由于某些原因我坚持使用 data.table 1.9.2
猜你喜欢
  • 2012-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-03
  • 1970-01-01
  • 2021-01-26
  • 1970-01-01
  • 2010-09-21
相关资源
最近更新 更多