2011-09-28 52 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