我有2个数据框d1
和d2
。它们都有一个名为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)
答案 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_join
或dplyr
。
inner_join(d1, d2, by ='value')
# value
#1 7
#2 8
另一种方法是来自setdiff
intersect
和dplyr
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作为结果对象。