根据其他数据帧中的列表对数据帧进行子集

时间:2019-03-03 22:20:11

标签: r dataframe subset

我有三个data.frame,每个都有一个名为col的列。 我想过滤掉DataFrame1的所有行,例如col的值。 a中出现bcdDataFrame2。 为此,我正在使用

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

DataFrame3包含值列表,例如a;b;c中的c;d;acol。 同样在这种情况下,我想根据abcdDataFrame3的出现来过滤DataFrame1。

在进行匹配之前,如何扩展值列表?

数据大致为:

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 :(得分:2)

您可以执行以下操作

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