过滤数据框中未出现在其他数据框中的项目

时间:2016-02-04 06:14:59

标签: r dataframe

我有2个数据框d1d2。它们都有一个名为value的列。

我想将d2分成两个数据帧:d3和d4。 d3应包含value中未显示d1的行,而d4包含来自d2的{​​{1}}行value

我试过了:

d1

但似乎不正确:d3 = d2[!is.element(d2$value, d1$value),]的项目不符合预期。

提前感谢您的帮助。

更新

似乎d3不是解决方案

样本数据:

anti_join

因此,d1 = as.data.frame(c(1,2,3,4,5,6,7,8)) colnames(d1) = "value" d2 = as.data.frame(c(7,8,9,10,11,12)) colnames(d1) = "value" 应包含d3(因为9,10,11,12未出现在d1中),而9,10,11,12应包含d4(因为7,8)出现在d1)

2 个答案:

答案 0 :(得分:1)

我们可以使用anti_join来获取一个数据集中不在另一个

中的元素
library(dplyr)
anti_join(d2, d1, by = 'value') %>%
                           arrange(value)
#    value
#1     9
#2    10
#3    11
#4    12

要获取公共元素,可以使用merge中的inner_joindplyr

inner_join(d1, d2, by ='value')
#   value
#1      7
#2      8

另一种方法是来自setdiff

intersectdplyr
 setdiff(d2, d1)
 intersect(d1, d2)

注意:假设只有一列。

答案 1 :(得分:1)

您的样本数据可以这样表达:

d1 <- data.frame("value"=c(1,2,3,4,5,6,7,8))
d2 <- data.frame("value"=c(7,8,9,10,11,12))

但实际上那些不需要数据框架,它们只是向量。

d3 <- d2[! d2$value %in% d1$value,]
d4 <- d2[d2$value %in% d1$value,]

这导致d3和d4是向量,因为这基本上就是输入。如果data.frames有超过1列,那么您将获得data.frames作为结果对象。