Фильтр на основе нескольких значений в столбце - PullRequest
1 голос
/ 07 марта 2020

У меня возникли некоторые проблемы при фильтрации кадра данных на основе нескольких значений в столбце.

У меня есть два кадра данных, которые выглядят так:

первый кадр данных:

r <- data.frame(d = c("100", "100,111", "100,111,123", "112"), r = c("3", "3,6,7", "42,57", "7"))

второй фрейм данных:

m <- data.frame(i = c("42,57", "6", "3,6"))

Теперь я хочу отфильтровать r так, чтобы

  1. r $ r == m $ c все значения точно совпадают, где результирующие кортежи r будут ("100,111,123"; "42,57)

  2. r $ r ~ m $ c где одного элемента (элементов, разделенных на «,» с обеих сторон достаточно для сохранения строки, где результирующие кортежи r будут («100»; «3»), («100,111»; «3,6,7» ") и (" 100,111,123 ";" 42,57 ")

Любая помощь будет принята с благодарностью. Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 07 марта 2020

Опция:

r[r$r %in% m$i,]

#             d     r
# 3 100,111,123 42,57

r[sapply(seq_along(r$r), function(x) any(unlist(strsplit(as.character(r$r[x]), ',')) %in% unlist(strsplit(as.character(m$i), ',')))),]

#             d     r
# 1         100     3
# 2     100,111 3,6,7
# 3 100,111,123 42,57
1 голос
/ 07 марта 2020

Мы можем использовать subset с %in%

subset(r, r %in% m$i)
#          d     r
#3 100,111,123 42,57

Или для второго случая

library(stringr)
library(dplyr)
r %>% 
    filter(str_detect(r, str_c(chartr(",", "|", m$i), collapse="|")))
#           d     r
#1         100     3
#2     100,111 3,6,7
#3 100,111,123 42,57
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...