私は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
関数を使用しますが、大きな数値を扱うときには遅くなることもあります。前もって感謝します。
あなたは 'ユニーク(D [、リストを(geneA = do.call(PMIN、D)、geneB = do.call(PMAX、D))])'試すことができますが、それはあなたが持っている場合にのみ機能します2つの列(それはあなたのために大丈夫でしょう)。 – nicola
@nicolaのメソッドを 'genes'に直接適用することもできます。同じ結果が得られ、 'revG'と' d'を作成する必要はありません。 – Jaap