查找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))
setdiff
function和你想象的完全一样。 把两个参数作为集合,并从第一个中删除第二个中的所有项目。
我发现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)