Вложенный оператор применения над списком списков - PullRequest
2 голосов
/ 27 июня 2019

Я хочу вытащить в seq.df белки (один столбец df), которые соответствуют индексам в сопоставлении map.list (список списков).

Пример данных:

seq.df<- rbind.data.frame("MTHISPAVYGLWAIMSVLLAAFCAY",
    "MERSSAIVFPNVGTSVLSATIHLVGVTVLAHLISRRTALRGTST",
    "MLFEPFWCLLDLLRWSLDTHYIPAKRPLNGGGRSSNFD")
map.list<- list(a<- list(2,3,4,5,6,7),
    b<- list(13,14,30,31,32),
    c<- list(5,6,10,11))

Желаемый вывод:

THISPA
GTAHL
PFLD

Если я запускаю вложенное приложение только для первого подсписка map.list, я получаю то, что хочу для первого белка:

prot.list<- apply(seq.df, 1, function (x) lapply(map.list[[1]], function (y) substring(x, y, y)))

возвращает ожидаемый результат для первой последовательности (THISPA,)

Но я не уверен, как заставить эту функцию повторяться по всем подспискам в map.list.Я попытался обернуть это в цикл for, но он не дает ожидаемого результата:

for (i in seq_along(map.list)){
  each.map.list<- map.list[[i]]
  prot.list<- apply(seq.df, 1, function (x) lapply(each.map.list, function (y) substring(x, y, y)))
}

Вывод:

SPGL
SAPN
PFLD

Я бы предпочел добавить еще одно выражение lapply,но я не уверен, как указать каждый список в map.list

#this does not work, but something like: 
prot.list<- apply(seq.df, 1, function (x) lapply(map.list, function (y) lapply([[y]], function (z) substring(x, z, z)))

Ответы [ 3 ]

4 голосов
/ 27 июня 2019

Мы можем использовать Map

unlist(Map(function(x, y) paste(substring(x, unlist(y), 
      unlist(y)), collapse=""), seq.df[[1]], map.list))
#[1] "THISPA" "GTAHL"  "PFLD"

Кроме того, вместо unlist дважды мы можем сделать один unlist в начале и использовать этот сплющенный list какввод

l1 <- lapply(map.list, unlist)  
sapply(Map(substring, seq.df[[1]], first = l1, last = l1), paste, collapse="")
#[1] "THISPA" "GTAHL"  "PFLD"  

Или с map2 из purrr

library(purrr)
map2_chr(seq.df[[1]], map.list, ~ str_c(substring(.x,
   unlist(.y), unlist(.y)), collapse=""))
2 голосов
/ 27 июня 2019

Вот решение с использованием mapply()

Он использует анонимную функцию, используя строку разделения символов seq.df в качестве x и список позиций в качестве y.

mapply( function(x,y) paste0( x[ unlist(y) ], collapse = "" ), 
        x = stringr::str_split( seq.df[,1], pattern = ""),
        y = map.list )

[1] "THISPA" "GTAHL"  "PFLD"
1 голос
/ 27 июня 2019
seq.df<- rbind.data.frame("MTHISPAVYGLWAIMSVLLAAFCAY",
                          "MERSSAIVFPNVGTSVLSATIHLVGVTVLAHLISRRTALRGTST",
                          "MLFEPFWCLLDLLRWSLDTHYIPAKRPLNGGGRSSNFD")
map.list<- list(a<- list(2,3,4,5,6,7),
                b<- list(13,14,30,31,32),
                c<- list(5,6,10,11))
lapply(1:nrow(seq.df), 
  function(x)paste(strsplit(as.character(seq.df[x,]), "")[[1]][unlist(map.list[[x]])], collapse=""))


[[1]]
[1] "THISPA"

[[2]]
[1] "GTAHL"

[[3]]
[1] "PFLD"
...