我有一个输入输入矩阵
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")]) ,]
,但它不起作用。
有什么建议吗?
答案 0 :(得分:2)
您可以使用列a
和b
的{{1}}和pmin
按行排序的列pmax
和a
对数据框进行分组,然后根据组包含至少两行的条件进行过滤:
b
答案 1 :(得分:1)
在基础R中,您可以将duplicated
与apply
一起使用:
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) )