2016-08-03 3 views
-1

私はdata.framesのリストを持っています。各data.frameは同じフォーマットの別々の出力です。私は、私は特に(1および3)2つの列を持って、私は重複を見つけるしたい重複ペアが存在する行インデックスを見つける方法

master <- do.call("rbind", list) 

でマスターリストにそれらのすべてをマージすることができ、私は

unique.pairs <- unique(master[duplicated(master[,c(1,3)]),c(1,3)]) 

これで、そうされ一意の列1,3のペアのdata.frameを私に与えます。

ここで、このペアの他のインスタンスがどこにあるのかを調べたいと思います。理想的な出力は、ペアリング(文字列を連結することができる)とマスターからの行名を含む別の列を持つdata.frameです(見つけようとしている重複の索引で簡単に入手できます)。

(関心の2列にストリップダウン)ダミー例:

master <- data.frame(A=c(1,1,2,2,3,3,4,4,5,5), B=c(1,2,3,3,4,5,6,6,7,8)) 
unique.pairs <- unique(master[duplicated(master,c(1,2)]),c(1,2)]) 

今、私のようなdata.frameを作ることができるようにしたい:

results <- data.frame(instance=c("2->3","4->6"), indices=c("3,4","7,8")) 

私は考えていますあなたはunique.pairsの各ペアを繰り返し処理しますそのペアがmasterのどこに存在するのかを調べることができますが、構文を理解できません。

+0

すべての列を一緒に貼り付けることができ、重複を検索するのに便利な「文字」ベクトルを作成することができます( 'duplicated.data.frame'が正確に行います)。つまり' do.call(paste、c (sep_len(nrow(master))〜、マスター、アイデンティティ)や、さらには 'split( ')'のようなアプローチを考えることもできます(seq_len(nrow(master))、master、sep = " - >"、drop = TRUE) 'を使用します。 'paste'ingベクタの代わりに。 –

+0

インデックスまたは行の名前を見つけるには、ダミーデータのマスターリスト列 –

+0

Typoの内部に条件を指定して、コードが実行されないようにすることで最適な 'which()'関数を見つけることができます。 – Frank

答えて

1

はあなたunique.pairs建設中にエラーが発生した私に見えたので、私はこの代替を提供します。

unique.pairs <- unique(master[ duplicated(master) ,c(1,2)]) 

そして、これはあなたの最初の並べ替えのベクトルを構築することを使用しています。

grps <- apply(master, 1, function(x) if (any(duplicated(rbind(unique.pairs, x)))) { paste(x[1],x[2], sep="->")}else{NA} +) 
grps 

#[1] NA  NA  "2->3" "2->3" NA  NA  "4->6" "4->6" NA  NA  

あなたはそのベクトルを使用して、他の関心項目をグループ化することができます。

> locs <- tapply(rownames(master), grps, function(x) paste(x, collapse=",")) 
> as.data.frame(locs) 
    locs 
2->3 3,4 
4->6 7,8 
2

W i番目data.table、あなたは...私たちもunique.pairsのようなオブジェクトを作成する必要はありません

library(data.table) 
setDT(master) 

master[master[, .N, by=names(master)][ N > 1L ], on=names(master), 
    .(N, locs = .(.I)), by=.EACHI] 

# A B N locs 
# 1: 2 3 2 3,4 
# 2: 4 6 2 7,8 

注を行うことができます。

Nは繰り返し回数です。 .(locs = .(.I))を使用するだけで出力から省略することができます。

関連する問題