2016-03-05 197 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