これは、この質問 ( data.table join の `j` で繰り返される列名にアクセスできますか? ) に関連しています。
2列だけのdata.table:
2 つを結合し、結合data.tables
された 2 つの列に対して単純な操作を実行するとします。これは、次の 1 回または 2 回の呼び出しで実行できます.[
。
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
最初に結合を実行してから減算を実行するという 2 つの呼び出しを行うと、すべてを一度に実行するよりも著しく高速であることがわかります。
> 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
ため、1 ステップのアプローチがより迅速であることが最終的にわかります。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