6

检查 data.table 中是否存在值的最快方法是什么?假设

  • dt 是 n 列的 data.table,其中 k 列是键
  • 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"这将有助于加快速度。

长答案:假设您想检查一个值(或超过 1 个值)是否存在于 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 

您可以更改allany是否要检查子集中是否存在至少 1 个值。两者之间的唯一区别是您首先subset使用data.table' 方法(利用keymult论证)。如您所见,它的速度非常快(并且扩展性也很好)。然后从子集中检索键列(调用它the_subset),

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

但是,the_subset[, V1]会慢一些。

当然,同样的想法也可以扩展到许多专栏,但我必须确切地知道你想做什么。

于 2013-06-27T06:59:57.803 回答
3

基本的 R 习语怎么样:

any(my.value %in% my.vector)

这不是一个data.table特定的习语,但我相信它非常有效。

于 2013-06-26T23:08:27.507 回答