Управление вложенными списками в R - PullRequest
0 голосов
/ 04 февраля 2020

Мои данные - это гены в списке структуры списка, например:

>listoflists <- list(samp1 = c("ENSG00000000003", "ENSG00000000005", "ENSG00000000419", "ENSG00000000457"),
              samp2 = c("ENSG00000002834", "ENSG00000002919", "ENSG00000002933"),
              samp3 = c("ENSG00000000971", "ENSG00000001036", "ENSG00000001084", "ENSG00000001167"))

Я пытаюсь преобразовать генные идентификаторы. При работе с аналогичными данными в структуре фрейма данных я успешно использовал такой код:

>library(org.Hs.eg.db)
>gene_df$symbol <- mapIds(org.Hs.eg.db,keys=rownames(gene_df),column="SYMBOL",keytype="ENSEMBL",multiVals="first")

Но сейчас я работаю со списком списков. Я хотел бы сохранить ту же структуру, и я думаю, что ответ, предоставленный здесь , должен дать мне понимание, но когда я пытаюсь использовать вложенную команду apply, как это:

>convertedLoL <- lapply(listoflists, function(x) lapply(listoflists[x], function(i)mapIds(org.Hs.eg.db,keys=listoflists[i],column="SYMBOL",keytype="ENSEMBL",multiVals="first")))
 Error in listoflists[[i]] : 
  attempt to select less than one element in get1index 

>convertedLoL <- lapply(listoflists, function(x) lapply(listoflists[x], function(i)mapIds(org.Hs.eg.db,keys=listoflists[[x]][[i]],column="SYMBOL",keytype="ENSEMBL",multiVals="first")))
 Error in listoflists[[x]] : no such index at level 1 

I продолжайте получать ошибки. Я думаю, что мои проблемы проистекают из того факта, что я не полностью понимаю, как работает приложение и как ссылаться на списки. Может ли кто-нибудь мне помочь?

РЕДАКТИРОВАТЬ

Я думал, что понял это, но это все еще не совсем правильно.

>convertedLoL <- lapply(listoflists, function(x) sapply(x, function(i)mapIds(org.Hs.eg.db,keys=i,column="SYMBOL",keytype="ENSEMBL",multiVals="first")))

даст мне то, что может быть списком из списка. Это также очень медленно. Так что мне все еще нужна помощь ...

1 Ответ

3 голосов
/ 04 февраля 2020

Вы показываете список векторов в вашем примере. Вы можете просто сделать:

lapply(listoflists, function(x) mapIDs(org.Hs.eg.db, keys=x, column="SYMBOL", keytype="ENSEMBL", multiVals="first")))

Что касается скорости, со многими списками (или векторами и, возможно, перекрывающимися элементами), вам может быть лучше сопоставить все (использованные) идентификаторы с SYMBOL один раз, а затем выполнить поиск этих данных. .frame / data.table / named vector.

# get all ids used in the lists as named vector
geneids <- unique(Reduce(c, listoflists))
key.table <- select(org.Hs.eg.db, keys = geneids, columns = c("SYMBOL","ENSEMBL"),
    keytype = "ENSEMBL")
keys <- setNames(key.table$SYMBOL, key.table$ENSEMBL)

convertedLoL <- lapply(listoflists, function(x) keys[x])

...