Фильтрация строк data.table по наличию столбца в strsplit другого столбца - PullRequest
1 голос
/ 03 апреля 2019

У меня есть таблица данных:

dt <- data.table(col1=c('aa,bb', 'bb,cc,ee', 'dd,ee'), col2=c('aa', 'cc', 'aa'))
> dt
    col1      col2
1: aa,bb      aa
2: bb,cc,ee   cc
3: dd,ee      aa

Я хочу проверить, встречается ли столбец 2 в строке strsplit первого столбца, поэтому для первой строки, если aa присутствует в aa,bb, разделенном запятой, что верно. Это также верно для второго ряда и ложно для третьего. Я только хочу сохранить строки там, где это происходит, поэтому только строки 1 и 2.

Моей первой мыслью было сделать это так:

dt[col2 %in% strsplit(col1, ',')]

Однако, это возвращает пустой data.table.

Я могу придумать несколько решений для решения этой проблемы, включая создание новых столбцов с использованием tstrsplit или плавление таблицы данных, но все это немного утомительно для такой, казалось бы, простой задачи. Какие-либо предложения?

1 Ответ

1 голос
/ 03 апреля 2019

Мы можем использовать str_detect из stringr

library(stringr)
dt[, flag := str_detect(col1, col2)]
dt
#       col1 col2  flag
#1:    aa,bb   aa  TRUE
#2: bb,cc,ee   cc  TRUE
#3:    dd,ee   aa FALSE

Также, чтобы избежать совпадений подстрок, мы можем указать границу слова (\\b)

dt[, str_detect(col1, str_c("\\b", col2, "\\b"))]
#[1]  TRUE  TRUE FALSE

Что касается использования strsplit, то результатом будет list из vector с.Итак, нам нужно использовать функцию, которая проверяет значения 'col1' в соответствующих элементах list.Map делает это

dt[,  unlist(Map(`%in%`, col2, strsplit(col1, ",")))]

Чтобы применить фильтр на том же шаге и вернуть 2 строки data.table:

dt[unlist(Map(`%in%`, col2, strsplit(col1, ",")))]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...