查找数据框的补充(反连接)

oer*_*cim 29 merge join r r-faq

我有两个数据帧(df和df1).df1是df的子集.我想获得一个数据帧,它是df中df1的补码,即返回第一个数据集的行,这些行在第二个数据集中不匹配.比如让,

数据框df:

heads
row1
row2
row3
row4
row5
Run Code Online (Sandbox Code Playgroud)

数据框df1:

heads
row3
row5
Run Code Online (Sandbox Code Playgroud)

然后所需的输出df2是:

heads
row1
row2
row4
Run Code Online (Sandbox Code Playgroud)

Dav*_*urg 54

您也可以使用data.tables二进制连接进行某种类型的反连接

library(data.table)
setkey(setDT(df), heads)[!df1]
#    heads
# 1:  row1
# 2:  row2
# 3:  row4
Run Code Online (Sandbox Code Playgroud)

编辑:启动data.table v1.9.6 +我们可以在使用时无需设置键即可加入data.tableson

setDT(df)[!df1, on = "heads"]
Run Code Online (Sandbox Code Playgroud)

EDIT2:引入了data.table v1.9.8 + fsetdiff,它基本上是上面解决方案的变体,只是xdata.table的所有列名,例如x[!y, on = names(x)].如果all设置为FALSE(默认行为),则仅x返回唯一的行.对于每个data.table中只有一列的情况,以下内容将等同于之前的解决方案

fsetdiff(df, df1, all = TRUE)
Run Code Online (Sandbox Code Playgroud)

  • @JdeMello 您可以指定不同的键 - 请参阅 `?data.table` 在“参数”部分中查找 `on`。 (2认同)

akr*_*run 29

尝试anti_joindplyr

library(dplyr)
anti_join(df, df1, by='heads')
Run Code Online (Sandbox Code Playgroud)


C_Z*_*_Z_ 20

尝试%in%命令并将其反转!

df[!df$heads %in% df1$heads,]
Run Code Online (Sandbox Code Playgroud)

  • 支持base R解决方案,尽管它可能不是最快的解决方案。 (2认同)
  • 如果我想做一个反连接并且有多个键/列,语法看起来如何? (2认同)

Joe*_*Joe 6

另一种选择,使用base R和setdiff函数:

df2 <- data.frame(heads = setdiff(df$heads, df1$heads))
Run Code Online (Sandbox Code Playgroud)

setdiff完全按照您的想象运作; 将两个参数作为集合,并从第一个中删除第二个中的所有项目.

我发现setdiff更可读的tahtn %in%并且在我不需要时不想要额外的库,但你使用的答案主要是个人品味的问题.

  • @DavidArenburg,该函数是“match”。 (2认同)

lee*_*sej 5

dplyr也有setdiff()会让您

在此处输入图片说明

setdiff(bigFrame, smallFrame) 在第一个表中获取额外的记录。

因此,对于OP的示例,代码将读取为 setdiff(df, df1)

dplyr具有很多强大的功能:有关快速简单的指南,请参见此处。