将数据框子集到未出现在另一个数据框中的行

时间:2016-03-05 04:15:32

标签: r dataframe subset

我有一个带有观察的数据框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中做到这一点吗?我使用的数据帧只是任意数据。

5 个答案:

答案 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)

一种方法是将AB的所有列粘贴在一起,限制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)

使用您可以执行反连接,如下所示:

library(data.table)
setDT(df1)[!df2, on = names(df1)]

给出了期望的结果:

   Var1 Var2 Var3
1:    4    5    7
2:    4    5    8
3:    6    7    9