Я хотел бы подмножество 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% - неправильный метод, как бы вы решили эту проблему?





То, что вы делаете, делает 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)
Я фильтрую
> 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
Привет, Эммануэль. Спасибо за советы. Я только что понял, что такой подход вернет только первый матч! Попробуйте этот 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))) DT1[col1 == DT2$col1 & col2 == DT2$col2], строки (2,4) и (3,5) должны появляться более одного раза
Вы правы, я отредактировал свой ответ. Вот почему приведенный вначале воспроизводимый пример помогает правильно ответить.
Спасибо, Эммануэль. Исходный пример огромен и настолько громоздок, что не позволяет нам обнаружить эту ошибку. Я думаю, что подобные исключения могут быть воспроизведены только в том случае, если вы действительно этого ищете.
Между прочим, этот метод не является устойчивым как таковой для моей таблицы данных из 41 столбца, 45 миллионов строк и размером 17 ГБ. Есть предложения по оптимизации производительности?
Не могли бы вы предоставить воспроизводимый пример?