Подстановка фреймов данных в соответствии со списками в другом фрейме данных - PullRequest
0 голосов
/ 04 марта 2019

У меня есть три data.frame с, каждый со столбцом с именем col.Я хочу отфильтровать все строки DataFrame1, значения которых col, например, a, b, c и d отображаются в DataFrame2.Для этого я использую

subset(DataFrame1, !(col %in% DataFrame2$col))

DataFrame3 содержит списки значений, например a;b;c, c;d;a в col.Также в этом случае я хочу фильтровать DataFrame1 в соответствии с вхождениями a, b, c и d в DataFrame3.

Как расширить списки значений до того, как ясделать сопоставление?

Данные примерно:

DataFrame1 DataFrame2 DataFrame3

col data   col data   col   data
a   1      a   6      a;b;c 8
b   2      b   7      c;d;b 9
c   3
d   4
e   5

После фильтрации с DataFrame2 У меня осталось DataFrame1

col data
c   3
d   4
e   5

После фильтрации с DataFrame3 Ожидаю только в DataFrame1

col data
e   5

Данные:

DataFrame1 <- data.frame(col = letters[1:5], data = 1:5)
DataFrame2 <- data.frame(col = letters[1:2], data = 6:7)
DataFrame3 <- data.frame(col = c("a;b;c", "c;d;b"), col = 8:9)

1 Ответ

0 голосов
/ 04 марта 2019

Вы можете сделать следующее

DataFrame1 <- data.frame(col = letters[1:5], data = 1:5)
DataFrame2 <- data.frame(col = letters[1:2], data = 6:7)
DataFrame3 <- data.frame(col = c("a;b;c", "c;d;b"), col = 8:9)

Шаг фильтрации 1

df1 <- DataFrame1[!(DataFrame1$col %in% DataFrame2$col), ]
#  col data
#3   c    3
#4   d    4
#5   e    5

Шаг фильтрации 2

df2 <- df1[!(df1$col %in% unlist(strsplit(as.character(DataFrame3$col), ";"))), ]
df2
#  col data
#5   e    5

Или то же самое в dplyr цепь

library(dplyr)
DataFrame1 %>%
    filter(!(col %in% DataFrame2$col)) %>%
    filter(!(col %in% unlist(str_split(DataFrame3$col, ";"))))
#  col data
#1   e    5
...