我想要对具有ID列(v1
,所有唯一的)和“链接”ID列(v2
)的数据框进行子集化。 v2
的期望是它可能包含NA
s,但在v1
的情况下,v2
的相应元素不会出现在v2
的其他位置。此外,期望列之间的关系是对称的:其中有一个条目x,在v1
中该行的v1
条目,y,镜像在另一行{{1有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)
,而更通用的解决方案不能做出这样的假设。
答案 0 :(得分: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