6

これは、この質問 ( 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.tablej

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 
4

1 に答える 1