通过列之间的异常关系来子集数据帧

时间:2011-09-28 17:45:36

标签: r

我想要对具有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),而更通用的解决方案不能做出这样的假设。

1 个答案:

答案 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