查找dataframe的补充(反连接)

我有两个dataframe(df和df1)。 df1是df的子集。 我想获得一个dataframe,这是df中df1的补充。 比如让,

dataframedf:

heads row1 row2 row3 row4 row5 

dataframedf1:

 heads row3 row5 

那么所需的输出df2是:

 heads row1 row2 row4 

试试anti_joindplyr

 library(dplyr) anti_join(df, df1, by='heads') 

你也可以用data.table的二进制连接做一些反连接

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

编辑:启动data.table v1.9.6 +我们可以joindata.tables没有设置键,而使用

 setDT(df)[!df1, on = "heads"] 

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

 fsetdiff(df, df1, all = TRUE) 

试试%in%命令,然后用!

 df[!df$heads %in% df1$heads,] 

另一个选项,使用基本的R和setdiff函数:

 df2 <- data.frame(heads = setdiff(df$heads, df1$heads)) 

setdifffunction和你想象的完全一样。 把两个参数作为集合,并从第一个中删除第二个中的所有项目。

我发现setdiff更具可读性, %in%中不需要额外的库,但是使用哪个答案在很大程度上是个人品味的问题。

dplyr也有setdiff()这将让你

在这里输入图像描述

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

所以对于OP的例子,代码会读取setdiff(df, df1)

dplyr有很多很棒的function:快速简单的指导请看这里。

另一种方法negate_match_df通过操作plyr软件包的plyr代码来创build一个函数negate_match_df

 library(plyr) negate_match_df <- function (x, y, on = NULL) { if (is.null(on)) { on <- intersect(names(x), names(y)) message("Matching on: ", paste(on, collapse = ", ")) } keys <- join.keys(x, y, on) x[!keys$x %in% keys$y, , drop = FALSE] } 

数据

 df <- read.table(text ="heads row1 row2 row3 row4 row5",header=TRUE) df1 <- read.table(text ="heads row3 row5",header=TRUE) 

产量

 negate_match_df(df,df1)