选择成对重复的行[A-B& B-A]

时间:2016-09-21 22:55:04

标签: r subset

我有一个输入输入矩阵

df <- data.frame(a = c(1,1,2,4,3,5,2,1,1,3), b = c(4,3,3,1,2,2,4,4,4,2), d = LETTERS[1:10])

我想要

out <- data.frame(a = c(1,2,4,3,1,1,3), b = c(4,3,1,2,4,4,2), d = c(A,C,D,E,H,I,J))

#   a b d
# 1 1 4 A
# 2 2 3 C
# 3 4 1 D
# 4 3 2 E
# 5 1 4 H
# 6 1 4 I
# 7 3 2 J

我想提取在两列中重复的任何行 - 也是以相反的顺序

我尝试了df[duplicated(df[c("a")]) | duplicated(df[c("b")]) ,],但它不起作用。

有什么建议吗?

3 个答案:

答案 0 :(得分:2)

您可以使用列ab的{​​{1}}和pmin按行排序的列pmaxa对数据框进行分组,然后根据组包含至少两行的条件进行过滤:

b

答案 1 :(得分:1)

在基础R中,您可以将duplicatedapply一起使用:

df[(duplicated(df$a)&duplicated(df$b))|
   apply(df,1, function(l) sum((l[["a"]]==df$b)&(l[["b"]]==df$a))>0),]

   a b d
1  1 4 A
3  2 3 C
4  4 1 D
5  3 2 E
7  2 4 G
8  1 4 H
9  1 4 I
10 3 2 J

答案 2 :(得分:0)

还可以使用pairwise max和min(pmax和pmin)覆盖顺序,然后从第一个和最后一个查找重复的行,并合并两个结果。虽然是一个很长的解决方案,但它可能会引起人们的兴趣:

df <- data.frame(a = c(1,1,2,4,3,5,2,1,1,3), b = c(4,3,3,1,2,2,4,4,4,2), d = LETTERS[1:10])

out <- data.frame(a = c(1,2,4,3,1,1,3), b = c(4,3,1,2,4,4,2), d = c('A','C','D','E','H','I','J'))    


mx<- with (df, pmax(a,b))
mn<- with (df, pmin(a,b))

df2<- data.frame(mx, mn)
df2

a<- df[duplicated(df2),]
b<- df[duplicated(df2,fromLast = T),]

res<- merge(a,b,all = T)
res<- res[order(res$d),]

res 
out

#check
sum (as.character(res$d) !=as.character(out$d) )