Подмножество в списке кортежей (несколько столбцов) с предложением% в%

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

Не могли бы вы предоставить воспроизводимый пример?

Emmanuel-Lin 03.07.2018 11:18
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
139
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

То, что вы делаете, делает 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) должны появляться более одного раза

Kenny 03.07.2018 17:58

Вы правы, я отредактировал свой ответ. Вот почему приведенный вначале воспроизводимый пример помогает правильно ответить.

Emmanuel-Lin 03.07.2018 19:07

Спасибо, Эммануэль. Исходный пример огромен и настолько громоздок, что не позволяет нам обнаружить эту ошибку. Я думаю, что подобные исключения могут быть воспроизведены только в том случае, если вы действительно этого ищете.

Kenny 04.07.2018 10:48

Между прочим, этот метод не является устойчивым как таковой для моей таблицы данных из 41 столбца, 45 миллионов строк и размером 17 ГБ. Есть предложения по оптимизации производительности?

Kenny 05.07.2018 18:42

Другие вопросы по теме