如何减少执行时间以检查R中列表元素的存在?

时间:2018-07-04 10:55:08

标签: r list

我有几个与几个单元格相对应的列表。每个列表包含约5000个基因的表达值。例如

Gm12878 <- list('gene1'= 3.14, 'gene4' = 1.11, 'gene10'= 1111,...)
K562 <- list('gene4'= 8.1, 'gene20'= 0.11, 'gene31'= 100,...)
.
.
H1hESC <- list('gene1'= 5.1, 'gene31'= 1.11, 'gene200'= 10,...)

单元格行的名称包含在另一个名为Cells的列表中。细胞的结构是

Cells[1] <- "Gm12878"
Cells[2] <- "K562"
.
.
Cells[5] <- "H1hESC"

在另一个列表中,我有所有基因的名称。例如,

Genelist[1] <- "gene1"
Genelist[2] <- "gene2"
.
.
Genelist[15000] <- "gene150050"

我要检查细胞系列表中是否存在基因,即Genelist的一个元素(例如“ gene10500”)。

这是我的代码:

Cells <- list("Gm12878","K562", "H1hESC")

for(i in 1:length(Genelist)){
  for(j in 1:length(Cells)){
    check_val <- eval(parse(text=paste(c(Cells[j],"$`", annotation_list[i],"`"), collapse = "")))
    if(is.null(check_val)){
      print("FALSE")
      } else {
        print(check_val)
      }
  }
  }

不幸的是,如果Genelist很长(我的情况是大约155000),则代码将花费很长时间执行。关于如何减少执行时间有什么建议吗?

2 个答案:

答案 0 :(得分:1)

您可以使用列表的名称:

Gm12878 <- list('gene1'= 3.14, 'gene4' = 1.11, 'gene10'= 1111)
K562 <- list('gene4'= 8.1, 'gene20'= 0.11, 'gene31'= 100)
H1hESC <- list('gene1'= 5.1, 'gene31'= 1.11, 'gene200'= 10)

Genelist <- c("gene1", "gene4", "gene50")
Cells <- list("Gm12878","K562", "H1hESC")

for(c in Cells) {
  print(eval(parse(text=paste0("Genelist %in% names(", c, ")"))))
}
[1]  TRUE  TRUE FALSE
[1] FALSE  TRUE FALSE
[1]  TRUE FALSE FALSE

答案 1 :(得分:1)

如果您按照以下关系格式组织细胞/基因数据集,可能会更好(因为运行时间更快,代码更短)

Gm12878 <- list('gene1'= 3.14, 'gene4' = 1.11, 'gene10'= 1111)
K562 <- list('gene4'= 8.1, 'gene20'= 0.11, 'gene31'= 100)
H1hESC <- list('gene1'= 5.1, 'gene31'= 1.11, 'gene200'= 10)

Genelist <- c("gene1", "gene4", "gene50")
Cells <- c("Gm12878","K562", "H1hESC")

#reorganize into a relational format
library(data.table)
genes <- rbindlist(lapply(Cells, function(x) cbind(Cell=x, stack(get(x)))))
setkey(genes, Cell, ind)
genes

对于简单的查询,例如检查gene1是否在Gm12878中:

genes[.("Gm12878", "gene1"), .N > 0]
#[1] TRUE

或者在1个大数据中查看全部内容。

dcast(genes, ind ~ Cell, function(x) length(x) > 0, value.var="ind")

       ind Gm12878  K562 H1hESC
1:   gene1    TRUE FALSE   TRUE
2:   gene4    TRUE  TRUE  FALSE
3:  gene10    TRUE FALSE  FALSE
4:  gene20   FALSE  TRUE  FALSE
5:  gene31   FALSE  TRUE   TRUE
6: gene200   FALSE FALSE   TRUE