R 将一个数据帧子集到另一个数据帧中未出现的行
我有一个带有观测值的数据框aR 将一个数据帧子集到另一个数据帧中未出现的行,r,dataframe,subset,data.table,R,Dataframe,Subset,Data.table,我有一个带有观测值的数据框a Var1 Var2 Var3 1 3 4 2 5 6 4 5 7 4 5 8 6 7 9 Var1 Var2 Var3 1 3 4 2 5 6 Var1 Var2 Var3 4 5 7 4
Var1 Var2 Var3
1 3 4
2 5 6
4 5 7
4 5 8
6 7 9
Var1 Var2 Var3
1 3 4
2 5 6
Var1 Var2 Var3
4 5 7
4 5 8
6 7 9
数据框B和观测值
Var1 Var2 Var3
1 3 4
2 5 6
4 5 7
4 5 8
6 7 9
Var1 Var2 Var3
1 3 4
2 5 6
Var1 Var2 Var3
4 5 7
4 5 8
6 7 9
这基本上是a的一个子集。
现在我想选择A中的观测值,而不是B中的观测值,即数据框C中的观测值
Var1 Var2 Var3
1 3 4
2 5 6
4 5 7
4 5 8
6 7 9
Var1 Var2 Var3
1 3 4
2 5 6
Var1 Var2 Var3
4 5 7
4 5 8
6 7 9
有没有一种方法我可以在R里做到这一点?我使用的数据帧只是任意数据。一种方法是将A和B的所有列粘贴在一起,限制A中粘贴的表示形式不会出现在B的粘贴表示形式中的行: 这种方法的一个明显缺点是,它假定具有相同粘贴表示的两行实际上是相同的。这里有一个稍微笨拙的方法,没有这个限制:
combined <- rbind(B, A)
combined[!duplicated(combined) & seq_len(nrow(combined)) > length(B),]
# Var1 Var2 Var3
# 5 4 5 7
# 6 4 5 8
# 7 6 7 9
基本上,我使用rbind将A附加到B下面,然后将其限制为非重复行和非原始行。使用sqldf是一个选项
require(sqldf)
C <- sqldf('SELECT * FROM A EXCEPT SELECT * FROM B')
dplyr有一个很好的anti_join函数,它可以实现以下功能:
> library(dplyr)
> anti_join(A, B)
Joining by: c("Var1", "Var2", "Var3")
Var1 Var2 Var3
1 6 7 9
2 4 5 8
3 4 5 7
另一种选择:
C <- rbind(A, B)
C[!(duplicated(C) | duplicated(C, fromLast = TRUE)), ]
使用可以按如下方式执行反联接:
library(data.table)
setDT(df1)[!df2, on = names(df1)]
这将产生所需的结果:
Var1 Var2 Var3
1: 4 5 7
2: 4 5 8
3: 6 7 9
您应该首先安装sqldf:install.packagessqldf