如何减少执行时间来检查 R 中是否存在列表元素?



我有几个对应于几个细胞系的列表。每个列表包含大约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[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(,代码需要很长时间才能执行。关于如何减少执行时间的任何建议?

您可以使用列表的名称:

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

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

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

或者在一个大数据帧中查看所有内容

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

最新更新