我有一个data.table
,有两列基因,每行被视为一对。一些基因对重复,顺序颠倒。我正在寻找一种更快的方法,最好不使用像我提供的那样的循环,以保持我的表中的唯一对。
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
包含重复的反向对。循环之后,剩下一个副本。我使用原始基因表并获取了一个子集,不包括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
函数来完成工作,但在处理更大的数字时也可能会很慢。提前致谢。
答案 0 :(得分: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