#r #data.table
#r #data.table
Вопрос:
Учитывая этот пример с двумя таблицами данных.table, каждая из которых содержит только один ключ столбца, мне нужен логический вектор ключей в y, которые не найдены в x, но я не могу угадать лучший способ сделать это в data.table (используя семантику data.table):
#given
x = data.table(n=1:10, key="n")
y = data.table(n=4:13, key="n")
#i need:
y$n %in% x$n # TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE
Это мои уродливые варианты (в дополнение к вышесказанному)
x[, .(n, dummy = n)][y, !is.na(dummy)]
y[, .(n, dummy = F)][x, dummy:=T][]
Обратите внимание, что:
x[y, 1]
почти решает мой вопрос, он извлекает y
ключи, не имеющие аналогов в x
as NA
, даже если x[y, "n"]
извлекает все ключи y
не только в непревзойденных. Но я не нашел никакой документации, подтверждающей это.
Заранее спасибо
Редактировать:
Также я отметил, что подходы data.table быстрее, чем% в%, поэтому я хочу воспользоваться этим.
x = data.table(n = sample(1:1e8, size = 1e7), key = "n")
y = data.table(n = sample(1:1e8, size = 1e7), key = "n")
system.time(y$n %in% x$n) # about a second
system.time(x[y, 1]) # about half a second
Комментарии:
1.Что не так с
y[, n %in% x$n]
или вашим исходным не-data.table
y$n %in% x$n
?2. насколько я могу проверить с помощью system.time, это медленнее, поскольку% в% — это база R, которая не так оптимизирована, как data.table
3. Это соответствующее редактирование. Следует отметить, что
y$n %in% x$n
затмевает все остальные выражения доsize=1e5
или1e6
, после чего ваше соединение начинает выходить вперед. Но даже в примереsize=1e7
basic%in%
работает в худшем случае на 50% медленнее. Хотя вы могли бы выжать немного больше сока из этого камня, стоит ли усложнять читаемость на несколько миллисекунд?
Ответ №1:
От ?"[.data.table"
:
Дополнительно: на столбцы x теперь можно ссылаться с помощью префикса x . это особенно полезно при объединении для ссылки на столбцы соединения x, поскольку в противном случае они маскируются i. Например, X[Y, .(x.a-i.a, b), on=»a»].
итак,
!is.na(x[y, x.n])
это ответ
Комментарии:
1. элегантно. Если вам нужен не только вектор, но и сами значения:
data.table:::na.omit.data.table(x[x[y, x.n]])
Ответ №2:
Если вам нужны индексы, аналогичные тому, что сказал @r2evans, просто используйте %in%
и which
. Может быть, что-то вроде этого: which(x$n %in% y$n)
Комментарии:
1. Я придерживался исходного «я хочу логический вектор» , а не то же самое, что индексы в векторе.