查找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_join的dplyr 
 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)