извлекать содержимое больших списков через цикл - PullRequest
1 голос
/ 28 февраля 2020

У меня есть около 30 больших списков, и я хочу извлечь элементы, которые организованы одинаково во всех них.

> df[[2]][[1]][[4]][[1]][[1]][[1]][[1]][[3]][[1]]
[1] "Non-histaminic angioedema"
> df[[2]][[1]][[4]][[1]][[1]][[2]][[1]][[3]][[1]]
[1] "Rare urticaria"
> df[[2]][[1]][[4]][[1]][[1]][[3]][[1]][[3]][[1]]
[1] "Rare allergic respiratory disease"

Я хочу, чтобы al oop извлек всю эту информацию в data.frame. Я пытался использовать lapply, но у меня проблемы с правильной функцией для использования.

я никогда не использовал семейство apply, поэтому я был бы очень признателен за некоторые советы

----------------- edit

str(df)

$ Availability:List of 1
  ..$ Licence:List of 3
  .. ..$ FullName       :List of 2
  .. .. ..$ text  : chr "Creative Commons Attribution 4.0 International"
  .. .. ..$ .attrs: Named chr "en"
  .. .. .. ..- attr(*, "names")= chr "lang"
  .. ..$ ShortIdentifier: chr "CC-BY-4.0"
  .. ..$ LegalCode      : chr "https://creativecommons.org/licenses/by/4.0/legalcode"
 $ DisorderList:List of 2
  ..$ Disorder:List of 5
  .. ..$ OrphaNumber           : chr "98050"
  .. ..$ ExpertLink            :List of 2
  .. .. ..$ text  : chr "http://www.orpha.net/consor/cgi-bin/OC_Exp.php?lng=en&Expert=98050"
  .. .. ..$ .attrs: Named chr "en"
  .. .. .. ..- attr(*, "names")= chr "lang"
  .. ..$ Name                  :List of 2
  .. .. ..$ text  : chr "Rare allergic disease"
  .. .. ..$ .attrs: Named chr "en"
  .. .. .. ..- attr(*, "names")= chr "lang"
  .. ..$ ClassificationNodeList:List of 2
  .. .. ..$ ClassificationNode:List of 1
  .. .. .. ..$ ClassificationNodeChildList:List of 5
  .. .. .. .. ..$ ClassificationNode:List of 2
  .. .. .. .. .. ..$ Disorder                   :List of 4
  .. .. .. .. .. .. ..$ OrphaNumber: chr "658"
  .. .. .. .. .. .. ..$ ExpertLink :List of 2
  .. .. .. .. .. .. .. ..$ text  : chr "http://www.orpha.net/consor/cgi-bin/OC_Exp.php?lng=en&Expert=658"
  .. .. .. .. .. .. .. ..$ .attrs: Named chr "en"
  .. .. .. .. .. .. .. .. ..- attr(*, "names")= chr "lang"
  .. .. .. .. .. .. ..$ Name       :List of 2
  .. .. .. .. .. .. .. ..$ text  : chr "Non-histaminic angioedema"
  .. .. .. .. .. .. .. ..$ .attrs: Named chr "en"
  .. .. .. .. .. .. .. .. ..- attr(*, "names")= chr "lang"
  .. .. .. .. .. .. ..$ .attrs     : Named chr "8618"
  .. .. .. .. .. .. .. ..- attr(*, "names")= chr "id"
  .. .. .. .. .. ..$ ClassificationNodeChildList:List of 3
  .. .. .. .. .. .. ..$ ClassificationNode:List of 2
  .. .. .. .. .. .. .. ..$ Disorder                   :List of 4
  .. .. .. .. .. .. .. .. ..$ OrphaNumber: chr "91378"
  .. .. .. .. .. .. .. .. ..$ ExpertLink :List of 2
  .. .. .. .. .. .. .. .. .. ..$ text  : chr "http://www.orpha.net/consor/cgi-bin/OC_Exp.php?lng=en&Expert=91378"
  .. .. .. .. .. .. .. .. .. ..$ .attrs: Named chr "en"
  .. .. .. .. .. .. .. .. .. .. ..- attr(*, "names")= chr "lang"
  .. .. .. .. .. .. .. .. ..$ Name       :List of 2
  .. .. .. .. .. .. .. .. .. ..$ text  : chr "Hereditary angioedema"
  .. .. .. .. .. .. .. .. .. ..$ .attrs: Named chr "en"
  .. .. .. .. .. .. .. .. .. .. ..- attr(*, "names")= chr "lang"
  .. .. .. .. .. .. .. .. ..$ .attrs     : Named chr "12136"
  .. .. .. .. .. .. .. .. .. ..- attr(*, "names")= chr "id"
  .. .. .. .. .. .. .. ..$ ClassificationNodeChildList:List of 3
  .. .. .. .. .. .. .. .. ..$ ClassificationNode:List of 2
  .. .. .. .. .. .. .. .. .. ..$ Disorder                   :List of 4
  .. .. .. .. .. .. .. .. .. .. ..$ OrphaNumber: chr "528623"
  .. .. .. .. .. .. .. .. .. .. ..$ ExpertLink :List of 2
  .. .. .. .. .. .. .. .. .. .. .. ..$ text  : chr "http://www.orpha.net/consor/cgi-bin/OC_Exp.php?lng=en&Expert=528623"

это представляет структуру одного из моих списков, и я хочу извлечь только то, что содержится в

    df$DisorderList$Disorder$ClassificationNodeList$ClassificationNode$ClassificationNodeChildList$ClassificationNode$Disorder$Name$text

, как вы можете видеть, эта структура повторяется вдоль файла (в данном случае, дважды, потому что я вставляю только небольшую часть)

head(df$DisorderList$Disorder$ClassificationNodeList$ClassificationNode$ClassificationNodeChildList[1]$ClassificationNode$Disorder$Name$text)

[1] "Non-histaminic angioedema"

head(df$DisorderList$Disorder$ClassificationNodeList$ClassificationNode$ClassificationNodeChildList[2]$ClassificationNode$Disorder$Name$text)

[1] "Hereditary angioedema"

Я хочу извлечь эту информацию в каждый из 30 списков, которые у меня есть

1 Ответ

0 голосов
/ 28 февраля 2020

Мы можем использовать sapply до l oop над индексом 6-го вложенного списка и извлечь этот компонент (при условии, что все остальные индексы постоянны)

sapply(1:30, function(i) df[[2]][[1]][[4]][[1]][[1]][[i]][[1]][[3]][[1]])

Лучше проверить length из list, чтобы сделать это более динамичным c

l1 <- length(df[[2]][[1]][[4]][[1]][[1]][[i]])
sapply(seq_len(l1), function(i) df[[2]][[1]][[4]][[1]][[1]][[i]][[1]][[3]][[1]])

Или если мы используем обновленный пост ОП с именами

sapply(seq_len(l1), function(i) 
      df$DisorderList$Disorder$ClassificationNodeList$ClassificationNode$ClassificationNodeChildList[i]$ClassificationNode$Disorder$Name$text)

Используя воспроизводимый пример

lapply(1:3, function(i) df[[2]][[1]][[4]][[1]][[1]][[i]][[1]][[2]][[1]])
#[[1]]
#[1] 1 2 3

#[[2]]
#[1] 1 2 3

#[[3]]
#[1] 1 2 3

Или с pluck

library(purrr)
map(1:3, ~ pluck(df, 2, 1, 4, 1, 1, .x, 1, 2, 1))
#[[1]]
#[1] 1 2 3

#[[2]]
#[1] 1 2 3

#[[3]]
#[1] 1 2 3

data

df <- replicate(3, replicate(2, replicate(4, replicate(4, replicate(3, replicate(5, list( list( list( 1:3, 1:5), list( 1:3,  1:5))), simplify = FALSE), simplify = FALSE), simplify = FALSE), simplify = FALSE), simplify = FALSE), simplify = FALSE)
...