减去数据帧的操作

Din*_*air 19 r set dataframe

我有2个数据框 df1df2.

df1 <- data.frame(c1=c("a","b","c","d"),c2=c(1,2,3,4) )
df2 <- data.frame(c1=c("c","d","e","f"),c2=c(3,4,5,6) )

> df1
  c1 c2
1  a  1
2  b  2
3  c  3
4  d  4

> df2
  c1 c2
1  c  3
2  d  4
3  e  5
4  f  6
Run Code Online (Sandbox Code Playgroud)

我需要执行这两个数据帧的设置操作.我使用merge(df1,df2,all=TRUE)merge(df1,df2,all=FALSE)方法来获得这些数据帧的并集和交集,并获得所需的输出.获取这些数据帧减去的函数是什么,即一个数据帧中存在的所有位置,而不是另一个数据帧中的所有位置?我需要以下输出.

 c1 c2
1  a  1
2  b  2
Run Code Online (Sandbox Code Playgroud)

Aru*_*run 29

我记得我碰到这个未来确切的问题好几个月了.管理筛选我的Evernote单行程.

注意:这不是我的解决方案.信任归于谁写的(我现在似乎无法找到).

如果您不担心,rownames那么您可以这样做:

df1[!duplicated(rbind(df2, df1))[-seq_len(nrow(df2))], ]
#   c1 c2
# 1  a  1
# 2  b  2
Run Code Online (Sandbox Code Playgroud)

编辑:一个data.table解决方案:

dt1 <- data.table(df1, key="c1")
dt2 <- data.table(df2)
dt1[!dt2]
Run Code Online (Sandbox Code Playgroud)

或更好的单线(从v1.9.6 +):

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

这将返回所有行df1,其中df2$c1没有火柴df1$c1.

  • 这个`data.table`解决方案比执行`setdiff`或`%in%`查找快得多,谢谢! (2认同)

Nis*_*nth 10

我更喜欢sqldf包装:

require(sqldf)
sqldf("select * from df1 except select * from df2")

##   c1 c2
## 1  a  1
## 2  b  2
Run Code Online (Sandbox Code Playgroud)


Joh*_*sNE 5

我认为最简单的解决方案是使用 dplyr (tidyverse)。

require(tidyverse)
anti_join(df1, df2)
Run Code Online (Sandbox Code Playgroud)