2013-07-12 54 views
1

假設我有兩個數據幀:獨特且非唯一列表

數據幀1(我們稱之爲數據1):爲數據1

V1  V2  
1  "AB"  
3  "XY" 
5  "DH" 
8  "ST" 
7  "RE" 

代碼:

V1 <- c(1,3,5,8,7) 
V2 <- c("AB","XY", "DH", "ST","RE") 
Data1 <- data.frame(V1,V2) 

數據幀2(讓我們稱之爲本DATA2):

V1  V2  
1  "AB"  
2  "ZZ" 
3  "XY" 
5  "DH" 
8  "ST" 
對於數據

代碼:

V1 <- c(1,2,3,5,8) 
V2 <- c("AB","ZZ","XY","DH","ST") 
Data2 <- data.frame(V1,V2) 

如果你注意到,數據2的第二行(其中V2的值是「ZZ」)沒有出現在DATA1和在Data1(其中V2的值是「RE」)的最後一行不存在於Data2中。

A)我想列出所有不存在於任何一個數據幀中的V2值。
這個例子是「ZZ」和「RE」。

B)我想列出兩個數據幀中存在的所有V2值。
對於這個例子,結果將是「AB」,「XY」,「DH」,「ST」。

回答

2

您正在尋找?setdiff?intersect

inters <- intersect(DF2$V2, DF1$V2) 
[1] "AB" "XY" "DH" "ST" 

setdf <- c(setdiff(DF2$V2, DF1$V2), setdiff(DF1$V2, DF2$V2)) 
[1] "ZZ" "RE" 
1

您可以使用%in%表達式來查找在兩個數據框中是否存在V2的值。使用not表達式(!)查找兩個數據框中不存在的表達式,然後將這兩個結果綁定在一起。

> rbind(Data1[!Data1$V2 %in% Data2$V2,], Data2[!Data2$V2 %in% Data1$V2,]) 
    V1 V2 
5 7 RE 
2 2 ZZ 
> unique(rbind(Data1[Data1$V2 %in% Data2$V2,], Data2[Data2$V2 %in% Data1$V2,])) 
    V1 V2 
1 1 AB 
2 3 XY 
3 5 DH 
4 8 ST 

在這最後一塊:如果每V1,V2組合將是相同的,你可以簡單地寫

Data1[Data1$V2 %in% Data2$V2,] 

,並保存自己的一些代碼行。