我有2个数据框 df1
和df2
.
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
.
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)
我认为最简单的解决方案是使用 dplyr (tidyverse)。
require(tidyverse)
anti_join(df1, df2)
Run Code Online (Sandbox Code Playgroud)