Подмножество в списке кортежей (несколько столбцов) с предложением% in% - PullRequest
0 голосов
/ 03 июля 2018

Я хотел бы установить подмножество data.table, используя список кортежей (несколько столбцов) из другого data.table, но не уверен, как.

Из поднабора с использованием одного столбца

DT1[col1 %in% DT2(col_1)]

что я пробовал было

DT1[c(col1, col2) %in% DT2(col_1, col_2)]

хотя и не удачно. Ошибка

i evaluates to a logical vector length 91369852 but there are 45684926
rows. Recycling of logical i is no longer allowed as it hides more
bugs than is worth the rare convenience. Explicitly use
rep(...,length=.N) if you really need to recycle.

Есть идеи? Если %in% не правильный метод, как бы вы решили эту проблему?

1 Ответ

0 голосов
/ 03 июля 2018

То, что вы делаете, это создание 2 логических значений для каждой строки, так что у вас есть эта ошибка и вы не выполняете то, что вы что. Так что, действительно, %in% не способ сделать это.

Вы должны сделать это в двойном условии с and:

Я делаю воспроизводимый пример:

DT1 = as.data.table(data.frame(col1 = c(1,2,3,2,5,1,3,3,1,2), 
                               col2 = c(3,4,5,4,3,4,5,3,4,5), 
                               col3 = c(1,2,3,4,5,6,7,8,9,10))) 

DT2 = as.data.table(data.frame(col1 = c(1,2,1,2,3,4,3,2,4,3), 
                               col2 = c(3,4,5,3,6,4,5,4,3,4), 
                               col3=c(11,12,13,14,15,16,17,18,19,20)))

РЕДАКТИРОВАТЬ: основываясь на замечании, я исправляю свой ответ (Это было больше уловки, чем я думал).

Я создаю функцию фильтра, которая поможет мне проверить, есть ли совпадения в DT2

filter <- function(x){
  any(x[1] == DT2[["col1"]] & x[2] == DT2[["col2"]])
}

Я применяю эту функцию к каждому ряду DT1

indexes = apply(DT1, 1, filter)

I фильтр

> DT1[indexes, ]
   col1 col2 col3
1:    1    3    1
2:    2    4    2
3:    3    5    3
4:    2    4    4
5:    3    5    7
...