2017-03-15 7 views
3

私はdata.tableを2列の遺伝子で持ち、各行はペアとして扱いました。いくつかの遺伝子対は、逆の順序で複製される。私は、私が提供したようなループを使わないで、私のテーブルにユニークなペアを保つために、より速い方法を探しています。逆重複行の削除R

library(data.table) 
genes <- data.table(geneA = LETTERS[1:10], geneB = c("C", "G", "B", "E", "D", "I", "H", "J", "F", "A")) 

revG <- genes[,.(geneA = geneB, geneB = geneA)] 
d <- fintersect(genes, revG) 

for (x in 1:nrow(d)) { 
    entry <- d[,c(geneA[x], geneB[x])]; revEntry <- rev(entry) 
    dupEntry <- d[geneA %chin% revEntry[1] & geneB %chin% revEntry[2]] 
    if (nrow(dupEntry) > 0) { 
    d <- d[!(geneA %chin% dupEntry[,geneA] & geneB %chin% dupEntry[,geneB])] 
    } 
} 

テーブルオブジェクトdには、重複した逆のペアが含まれています。ループの後、それぞれのコピーが1つ残っています。私はオリジナルの遺伝子表を使用し、コピーを除外してdにサブセットをとり、インデックスを保存しました。私はgenesの最初の列と同じ名前のリストを持っています。インデックスは、ループで削除された重複ペアに基づいてリストをフィルタリングするために使用されます。

idx <- genes[!(geneA %chin% d[,geneA] & geneB %chin% d[,geneB]), which = TRUE] 

geneList <- vector("list", length = nrow(genes)); names(geneList) <- genes[,geneA] 
geneList <- geneList[idx] 

上記の方法は必ずしも遅すぎではありませんが、速度はその後、目立つかもしれないので、私は〜12K遺伝子を使用する予定。 questionと同じ問題が投稿されましたが、data.tableを使用していませんでした。ジョブを完了させるためにapply関数を使用しますが、大きな数値を扱うときには遅くなることもあります。前もって感謝します。

+1

あなたは 'ユニーク(D [、リストを(geneA = do.call(PMIN、D)、geneB = do.call(PMAX、D))])'試すことができますが、それはあなたが持っている場合にのみ機能します2つの列(それはあなたのために大丈夫でしょう)。 – nicola

+1

@nicolaのメソッドを 'genes'に直接適用することもできます。同じ結果が得られ、 'revG'と' d'を作成する必要はありません。 – Jaap

答えて

0

私はあなたが求めているのは、2で並べ替えのリストを与えられた場合、どのように組み合わせを得ることができると思いますか。 これはオプションで、igraphを使用して指定できます。

library(data.table) 
library(igraph) 
genes <- data.table(geneA = LETTERS[1:10], geneB = c("C", "G", "B", "E", "D", "I", "H", "J", "F", "A")) 
g <-graph_from_data_frame(genes, directed = F) 
g <- simplify(g, remove.multiple = T, remove.loops = T) 
get.data.frame(g) 
    from to 
1 A C 
2 A J 
3 B C 
4 B G 
5 D E 
6 F I 
7 G H 
8 H J 

#benchmark 
set.seed(1283782) 
fn1<-function(genes){ 
    g <-graph_from_data_frame(genes, directed = F) 
    g <- simplify(g, remove.multiple = T, remove.loops = T) 
    get.data.frame(g)} 
genes <- data.table(geneA = sample(LETTERS, 20000, T), geneB = sample(LETTERS, 20000, T)) 
microbenchmark(fn1(genes), times = 1) 
     expr  min  lq  mean median  uq  max neval 
fn1(genes) 8.605717 8.605717 8.605717 8.605717 8.605717 8.605717  1