Короткий ответ: В дополнение к nomatch=0
, думаю, mult="first"
поможет ускорить его еще больше.
Длинный ответ: Если предположить, что вы хотите проверить, если значение (или более чем 1 значение) присутствует в ключа столбца 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
Вы можете изменить all
к any
, если вы хотите, чтобы проверить, по крайней мере, 1 значение присутствует в подгруппе или нет. Единственное различие между ними состоит в том, что вы сначала subset
, используя подход data.table
(воспользовавшись аргументом key
и mult
). Как вы можете видеть, это очень быстро (и также хорошо масштабируется). А затем, чтобы получить ключевые столбцы из подмножества (назовем его the_subset
),
.subset2(the_subset, "V1") (or) the_subset$V1 (or) the_subset[["V1"]]
Но the_subset[, V1]
будет медленнее.
Конечно, та же идея может быть распространена и на многие столбцы, но я должен буду точно знать, что вы хотите делать.
Всегда лучше показать пример того, что вы пытаетесь сделать. Вы говорите «значение». И вы проверяете только одно значение? Также вы проверяете только один столбец data.table 'dt'? Является ли «ключ» 1-столбцом data.table? Поэтому я нахожу этот вопрос неопределенным. – Arun
@Arun Извините за неопределенность, надеюсь, что последнее редактирование помогает. Я ищу общее решение, а не только для случая, когда аргумент i является значением, или ключ - это всего лишь один столбец – Juancentro
, вам придется объяснить, отредактировав свой вопрос немного более подробно. – Arun