2011-09-28 51 views
1

我想要一個具有ID列(v1,全部唯一)和「鏈接」ID列(v2)的數據框的子集。 v2的期望是它可能包含NA s,但它在那裏,v1的相應元素不會出現在v2的其他地方。另外,預計列之間的關係是對稱的:其中有一個條目x,在v2中,該行的v1條目y被鏡像到另一行,其中v1具有x並且v2具有y。最後一個標準是關係不是自反的:即x!= y。由列之間的不尋常關係子集數據幀

我想將數據框的子集分配到不符合預期標準的元素。

下面是一些示例的數據來說明:

set.seed(1) 
dfr <- data.frame(v1=letters,v2=rev(letters)) 
dfr[sample(26,10),2]<-NA 
dfr[sample(26,5),2]<-sample(letters,5) 


dfr 
    v1 v2 
1 a z 
2 b <NA> 
3 c x 
4 d w 
5 e <NA> 
6 f u 
7 g <NA> 
8 h s 
9 i i 
10 j <NA> 
11 k p 
12 l <NA> 
13 m f 
14 n <NA> 
15 o l 
16 p k 
17 q j 
18 r e 
19 s <NA> 
20 t g 
21 u <NA> 
22 v e 
23 w <NA> 
24 x q 
25 y x 
26 z a 

所以行1,2,11,14,16,和26都符合標準,並欲識別的其餘部分。

我已經嘗試了一些使用match的解決方案,但NA正在引發問題。它也可能依賴於在這種情況下v2基於rev(v1)的事實,而更一般的解決方案不能做出這樣的假設。

回答

3

如果我理解正確的,這裏有一個例子:

> subset(dfr, (is.na(v2) & !(v1%in%dfr$v2)) | !is.na(v2) & paste(v1, v2) %in% paste(dfr$v2, dfr$v1)) 
    v1 v2 
1 a z 
2 b <NA> 
9 i i 
11 k p 
14 n <NA> 
16 p k 
26 z a 

# or if v1 == v2 is not included: 
> subset(dfr, (is.na(v2) & !(v1%in%dfr$v2)) | !is.na(v2) & (v1 != v2 & paste(v1, v2) %in% paste(dfr$v2, dfr$v1))) 
    v1 v2 
1 a z 
2 b <NA> 
11 k p 
14 n <NA> 
16 p k 
26 z a 
+0

謝謝你,第二個是正是我想要的。好的調用'paste'。 – James