我有一个带有观察的数据框A
Var1 Var2 Var3
1 3 4
2 5 6
4 5 7
4 5 8
6 7 9
和带有观察的数据框B
Var1 Var2 Var3
1 3 4
2 5 6
基本上是A的一个子集。 现在我想在B中的A NOT中选择观测值,即带有观测值的数据帧C
Var1 Var2 Var3
4 5 7
4 5 8
6 7 9
我有可能在R中做到这一点吗?我使用的数据帧只是任意数据。
答案 0 :(得分:7)
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
答案 1 :(得分:4)
使用sqldf是一个选项。
Object {action: "reffering_status", dataType: "json", prescription_id: "1", pat_ref_hosp: ""}
答案 2 :(得分:3)
一种方法是将A
和B
的所有列粘贴在一起,限制A
中的粘贴表示不会出现在{{}的粘贴表示中的行1}}:
B
这种方法的一个明显缺点是假设两行具有相同的粘贴表示实际上是相同的。这是一个稍微笨重的方法,没有这个限制:
A[!(do.call(paste, A) %in% do.call(paste, B)),]
# Var1 Var2 Var3
# 3 4 5 7
# 4 4 5 8
# 5 6 7 9
基本上,我使用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
的行。
答案 3 :(得分:3)
另一种选择:
C <- rbind(A, B)
C[!(duplicated(C) | duplicated(C, fromLast = TRUE)), ]
输出:
Var1 Var2 Var3
3 4 5 7
4 4 5 8
5 6 7 9
答案 4 :(得分:3)
使用data.table您可以执行反连接,如下所示:
library(data.table)
setDT(df1)[!df2, on = names(df1)]
给出了期望的结果:
Var1 Var2 Var3
1: 4 5 7
2: 4 5 8
3: 6 7 9