oer*_*cim 29 merge join r r-faq
我有两个数据帧(df和df1).df1是df的子集.我想获得一个数据帧,它是df中df1的补码,即返回第一个数据集的行,这些行在第二个数据集中不匹配.比如让,
数据框df:
heads
row1
row2
row3
row4
row5
数据框df1:
heads
row3
row5
然后所需的输出df2是:
heads
row1
row2
row4
Dav*_*urg 54
您也可以使用data.tables二进制连接进行某种类型的反连接
library(data.table)
setkey(setDT(df), heads)[!df1]
#    heads
# 1:  row1
# 2:  row2
# 3:  row4
编辑:启动data.table v1.9.6 +我们可以在使用时无需设置键即可加入data.tableson
setDT(df)[!df1, on = "heads"]
EDIT2:引入了data.table v1.9.8 + fsetdiff,它基本上是上面解决方案的变体,只是xdata.table的所有列名,例如x[!y, on = names(x)].如果all设置为FALSE(默认行为),则仅x返回唯一的行.对于每个data.table中只有一列的情况,以下内容将等同于之前的解决方案
fsetdiff(df, df1, all = TRUE)
akr*_*run 29
尝试anti_join从dplyr
library(dplyr)
anti_join(df, df1, by='heads')
C_Z*_*_Z_ 20
尝试%in%命令并将其反转!
df[!df$heads %in% df1$heads,]
另一种选择,使用base R和setdiff函数:
df2 <- data.frame(heads = setdiff(df$heads, df1$heads))
setdiff完全按照您的想象运作; 将两个参数作为集合,并从第一个中删除第二个中的所有项目.
我发现setdiff更可读的tahtn %in%并且在我不需要时不想要额外的库,但你使用的答案主要是个人品味的问题.