2016-09-21 2 views
4

私は入力入力行列選択ペアワイズ重複行[AB&BA]

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")]) ,]を試しましたが、動作しません。

提案がありますか?

+1

私はこれが重複しているかどうかわからないんだけど、それは他のいくつかの質問にかなり近いです。もっと一般的なケースとの唯一の違いは、それらを削除するのではなく、非ユニークな行を保持することです。これは単なる否定の問題です。例えば。 [データフレームからユニークな組み合わせの行を抽出する](http://stackoverflow.com/questions/21194611/extracting-ユニーク - コンビネーション--rows-from-a-data-frame-in-r)または[ペアワイズ重複除去from dataframe](http://stackoverflow.com/questions/25297812/pair-wise-duplicate-removal-from-dataframe)を参照してください。他にもさまざまな質問があります。 – Jota

答えて

2

あなたはグループが行方向によるデータフレーム列abpminpmaxを使用して列abをソートし、その基は少なくとも二列含まれていることを条件に基づいてフィルタリングすることができる:

library(dplyr) 
df %>% 
     group_by(pmin(a,b), pmax(a,b)) %>% 
     filter(n() >= 2) %>% 
     ungroup() %>% 
     select(a,b,d) 

# Source: local data frame [7 x 3] 
# 
#  a  b  d 
# <dbl> <dbl> <fctr> 
# 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 
+1

そして基底R等価(または少なくとも類似のアプローチ)は 'dfDups < - (df、cbind(pmin(a、b)、pmax(a、b)))であるかもしれません。 df [複製(dfDups)|重複(dfDups、fromLast = TRUE)、] ' – Jota

1

をベースRでは、applyと一緒duplicatedを使用することができます。

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 
+0

'base R'(すなわちあなたの解決策)が速く表示されます!!!私のマイクロベンチマークは、あなたのソリューションが 'dplyr'ソリューションより約4倍速いことを示しています。 –

0

1つはまたペアワイズメートルを使用することができますaxとmin(pmaxとpmin)を使用して順序をオーバーライドし、最初と最後から重複する行を見つけて、2つの結果をマージします。長いソリューションとはいえ、それが参考になります。

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)) 
関連する問題