Как уменьшить время выполнения, чтобы проверить наличие элемента списка в R? - PullRequest
0 голосов
/ 04 июля 2018

У меня есть несколько списков, соответствующих нескольким клеточным линиям. Каждый список содержит значения экспрессии около 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 голосов
/ 05 июля 2018

Вероятно, будет лучше (как в случае более быстрого выполнения и более короткого кода), если вы упорядочите свой набор данных клеток / генов в реляционном формате следующим образом

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 большой data.frame

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
0 голосов
/ 04 июля 2018

Вы можете использовать имена из списка:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...