2016-03-05 156 views
1

我有观测子集的数据帧到另一个数据帧

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 

数据帧B的数据帧A,其是基本上的一个子集未显示的行A. 现在我想在B中选择观察值A NOT,即数据帧C有观测值

Var1 Var2 Var3 
    4  5 7 
    4  5 8 
    6  7 9 

有没有一种方法可以在R中做到这一点?我使用的数据帧只是任意数据。

回答

3

一种方法可能是的AB所有列粘贴到一起,从而限制了该行的A其粘贴表示不会出现在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然后仅限于都是不重复的和不是最初从B行。

4

使用sqldf是一个选项。

require(sqldf) 

C <- sqldf('SELECT * FROM A EXCEPT SELECT * FROM B') 
+0

您应该安装 “sqldf” 第一:install.packages( “sqldf”) – NangSaigon

5

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 
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 
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