data.table: извлечение логического вектора совпадающих ключей между двумя таблицами данных

#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. Я придерживался исходного «я хочу логический вектор» , а не то же самое, что индексы в векторе.