Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 将一个数据帧子集到另一个数据帧中未出现的行_R_Dataframe_Subset_Data.table - Fatal编程技术网

R 将一个数据帧子集到另一个数据帧中未出现的行

R 将一个数据帧子集到另一个数据帧中未出现的行,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

我有一个带有观测值的数据框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       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