这与这个问题(我可以在 data.table 连接中访问 `j` 中的重复列名吗?)有关,因为我认为与此相反的是正确的。
data.table 只有 2 列:
假设您希望连接两个data.tables
,然后对两个连接的列执行简单操作,这可以通过一次或两次调用来完成.[
:
N = 1000000
DT1 = data.table(name = 1:N, value = rnorm(N))
DT2 = data.table(name = 1:N, value1 = rnorm(N))
setkey(DT1, name)
system.time({x = DT1[DT2, value1 - value]}) # One Step
system.time({x = DT1[DT2][, value1 - value]}) # Two Step
事实证明,进行两次调用(先进行联接,然后进行减法)比一次调用要快得多。
> system.time({x = DT1[DT2, value1 - value]})
user system elapsed
0.67 0.00 0.67
> system.time({x = DT1[DT2][, value1 - value]})
user system elapsed
0.14 0.01 0.16
为什么是这样?
data.table 有很多列:
如果您将很多列放入,data.table
那么您最终会发现一步法更快 - 大概是因为data.table
只使用您在中引用的列j
。
N = 1000000
DT1 = data.table(name = 1:N, value = rnorm(N))[, (letters) := pi][, (LETTERS) := pi][, (month.abb) := pi]
DT2 = data.table(name = 1:N, value1 = rnorm(N))[, (letters) := pi][, (LETTERS) := pi][, (month.abb) := pi]
setkey(DT1, name)
system.time({x = DT1[DT2, value1 - value]})
system.time({x = DT1[DT2][, value1 - value]})
> system.time({x = DT1[DT2, value1 - value]})
user system elapsed
0.89 0.02 0.90
> system.time({x = DT1[DT2][, value1 - value]})
user system elapsed
1.64 0.16 1.81