6

値が data.table に存在するかどうかを確認する最も速い方法は何ですか? 仮定

  • dt は、k 列がキーである n 列の data.table です。
  • keys は、リスト、値、data.table、またはi引数で使用できるものです[.data.table

私は現在やっています

NROW(dt[keys,nomatch=0])!=0

もっと速いものはありますか?

require(data.table)
iniDate = as.Date("2000-01-01")
theData = data.table(a = LETTERS, d = seq(from=iniDate ,to= iniDate + length(LETTERS)*3000-1,by="day"))
theKeys = data.table(a = c("J","M","T"), d = as.Date(c("2005-01-20","2005-05-20","2013-01-12")))
setkey(theData,a,d)
NROW(theData[theKeys],nomatch=0)!=0
4

2 に答える 2

7

短い答え: に加えて、さらに高速化に役立つnomatch=0と思います。mult="first"

長い答え: a のキー列に値 (または複数の値) が存在するかどうかを確認したい場合data.table、これははるかに高速に思えます。ここでの唯一の前提は、data.table にキー列が 1 つしかないことです (これは私にはかなりあいまいです)。

my.values = c(1:100, 1000)
require(data.table)
set.seed(45)
DT <- as.data.table(matrix(sample(2e4, 1e6*100, replace=TRUE), ncol=100))
setkey(DT, "V1")
# the data.table way
system.time(all(my.values %in% .subset2(DT[J(my.values), mult="first", nomatch=0], "V1")))
   user  system elapsed 
  0.006   0.000   0.006 

# vector (scan) approach
system.time(all(my.values %in% .subset2(DT, "V1")))
   user  system elapsed 
  0.037   0.000   0.038 

サブセットに少なくとも 1 つの値が存在するかどうかを確認する場合は、にall変更できます。any2 つの唯一の違いは、最初にのアプローチsubsetを使用することです (引数と引数を利用します)。ご覧のとおり、非常に高速です (また、スケーリングも良好です)。そして、サブセットからキー列を取得するには ( と呼びます)、data.tablekeymultthe_subset

.subset2(the_subset, "V1") (or) the_subset$V1 (or) the_subset[["V1"]]

しかし、the_subset[, V1]遅くなります。

もちろん、同じアイデアを多くの列に拡張することもできますが、後で何をしたいのかを正確に知る必要があります.

于 2013-06-27T06:59:57.803 に答える