删除反向重复行

abb*_*786 5 performance r duplicates data.table

我有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])]
  }
}
Run Code Online (Sandbox Code Playgroud)

表对象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]
Run Code Online (Sandbox Code Playgroud)

上面的方法不一定太慢,但我计划使用~12K基因,所以速度可能会很明显。我发现了一个问题,同样的问题张贴,但没有使用data.table。它使用一个apply函数来完成工作,但在处理更大的数字时也可能很慢。

Mar*_* GS 1

我相信,你所问的问题类似于,给定一个 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
Run Code Online (Sandbox Code Playgroud)