我有几个与几个单元格相对应的列表。每个列表包含约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),则代码将花费很长时间执行。关于如何减少执行时间有什么建议吗?
答案 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