13

data.table 構文 (X[Y] など) を使用して、merge(..., all = TRUE) と同等のものを作成することは可能ですか?

具体的には、次の結果を取得する非常に高速な方法が必要です。

item_length = data.table(index = 1:10, length =  c(2,5,4,6,3),key ="index")
item_weigth = data.table(index = c(2,4,6,7,8,11), weight= c(.3,.5,.2), key = "index")
merge(x2,y2, all=TRUE)

それは:

> merge(item_length ,item_weigth , all=TRUE)
      index length weight
[1,]     1      2     NA
[2,]     2      5    0.3
[3,]     3      4     NA
[4,]     4      6    0.5
[5,]     5      3     NA
[6,]     6      2    0.2
[7,]     7      5    0.3
[8,]     8      4    0.5
[9,]     9      6     NA
[10,]    10      3     NA
[11,]    11     NA    0.2
4

1 に答える 1

17

私自身の質問に答えて申し訳ありませんが、これは共有する価値があると思います:

非常に迅速な解決策は、data.table (1.8.0) の最新バージョンに更新することです。(どうもありがとう、マシュー!)

これが私のテストデータとベンチマーク結果です:

data.table を使用:

full_index <- 1:5000000
ratio_in_samples <- 0.8
x <- data.table(index = sample(full_index, length(full_index)*ratio_in_samples), 
                var1 = rnorm(length(full_index)*ratio_in_samples),
                key = "index")

y <- data.table(index = sample(full_index, length(full_index)*ratio_in_samples), 
                var2 = rnorm(length(full_index)*ratio_in_samples),
                key = "index")

system.time(
result <- merge(x,y, all=TRUE)
)

data.table の時間:

user  system elapsed 
5.05    0.55    5.62

一方、data.frame では:

full_index <- 1:5000000
ratio_in_samples <- 0.8
x <- data.frame(index = sample(full_index, length(full_index)*ratio_in_samples), 
                var1 = rnorm(length(full_index)*ratio_in_samples))

y <- data.frame(index = sample(full_index, length(full_index)*ratio_in_samples), 
                var2 = rnorm(length(full_index)*ratio_in_samples))

system.time(
  result <- merge(x,y, all=TRUE)
)

data.frame の時間:

user  system elapsed 
78.83    1.75   80.67 
于 2012-07-11T17:22:09.997 に答える