Извлечение элементов из разных уровней вложенного списка - PullRequest
0 голосов
/ 31 августа 2018

У меня есть вложенный список академических авторов, таких как:

> str(content)
List of 3
 $ author-retrieval-response:List of 1
  ..$ :List of 6
  .. ..$ @status       : chr "found"
  .. ..$ @_fa          : chr "true"
  .. ..$ coredata      :List of 3
  .. .. ..$ dc:identifier : chr "AUTHOR_ID:55604964500"
  .. .. ..$ document-count: chr "6"
  .. .. ..$ cited-by-count: chr "13"
  .. ..$ h-index       : chr "3"
  .. ..$ coauthor-count: chr "7"
  .. ..$ preferred-name:List of 2
  .. .. ..$ surname   : chr "García Cruz"
  .. .. ..$ given-name: chr "Gustavo Adolfo"
 $ author-retrieval-response:List of 1
  ..$ :List of 6
  .. ..$ @status       : chr "found"
  .. ..$ @_fa          : chr "true"
  .. ..$ coredata      :List of 3
  .. .. ..$ dc:identifier : chr "AUTHOR_ID:56595713900"
  .. .. ..$ document-count: chr "4"
  .. .. ..$ cited-by-count: chr "21"
  .. ..$ h-index       : chr "3"
  .. ..$ coauthor-count: chr "5"
  .. ..$ preferred-name:List of 2
  .. .. ..$ surname   : chr "Akimov"
  .. .. ..$ given-name: chr "Alexey"
 $ author-retrieval-response:List of 1
  ..$ :List of 6
  .. ..$ @status       : chr "found"
  .. ..$ @_fa          : chr "true"
  .. ..$ coredata      :List of 3
  .. .. ..$ dc:identifier : chr "AUTHOR_ID:12792624600"
  .. .. ..$ document-count: chr "10"
  .. .. ..$ cited-by-count: chr "117"
  .. ..$ h-index       : chr "6"
  .. ..$ coauthor-count: chr "7"
  .. ..$ preferred-name:List of 2
  .. .. ..$ surname   : chr "Alecke"
  .. .. ..$ given-name: chr "Björn"

Я заинтересован в извлечении следующих значений:

dc: идентификатор, количество документов, количество цитирований, h-индекс, соавтор, фамилия, имя

И анализ их в структуре, подобной фрейму данных.

У меня есть две проблемы: во-первых, я не могу получить доступ к различным уровням моего списка. Действительно, в то время как content[[3]] возвращает элементы третьего подсписка / автора, я не нашел способа получить доступ к подспискам третьего автора, то есть:

> content[[3]][[2]]
Error in content[[3]][[2]] : subscript out of bounds

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

Я вставляю dput из первых трех элементов моего списка:

structure(list(`author-retrieval-response` = list(structure(list(
    `@status` = "found", `@_fa` = "true", coredata = structure(list(
        `dc:identifier` = "AUTHOR_ID:55604964500", `document-count` = "6", 
        `cited-by-count` = "13"), .Names = c("dc:identifier", 
    "document-count", "cited-by-count")), `h-index` = "3", `coauthor-count` = "7", 
    `preferred-name` = structure(list(surname = "García Cruz", 
        `given-name` = "Gustavo Adolfo"), .Names = c("surname", 
    "given-name"))), .Names = c("@status", "@_fa", "coredata", 
"h-index", "coauthor-count", "preferred-name"))), `author-retrieval-response` = list(
    structure(list(`@status` = "found", `@_fa` = "true", coredata = structure(list(
        `dc:identifier` = "AUTHOR_ID:56595713900", `document-count` = "4", 
        `cited-by-count` = "21"), .Names = c("dc:identifier", 
    "document-count", "cited-by-count")), `h-index` = "3", `coauthor-count` = "5", 
        `preferred-name` = structure(list(surname = "Akimov", 
            `given-name` = "Alexey"), .Names = c("surname", "given-name"
        ))), .Names = c("@status", "@_fa", "coredata", "h-index", 
    "coauthor-count", "preferred-name"))), `author-retrieval-response` = list(
    structure(list(`@status` = "found", `@_fa` = "true", coredata = structure(list(
        `dc:identifier` = "AUTHOR_ID:12792624600", `document-count` = "10", 
        `cited-by-count` = "117"), .Names = c("dc:identifier", 
    "document-count", "cited-by-count")), `h-index` = "6", `coauthor-count` = "7", 
        `preferred-name` = structure(list(surname = "Alecke", 
            `given-name` = "Björn"), .Names = c("surname", "given-name"
        ))), .Names = c("@status", "@_fa", "coredata", "h-index", 
    "coauthor-count", "preferred-name")))), .Names = c("author-retrieval-response", 
"author-retrieval-response", "author-retrieval-response"))

Большое спасибо за вашу помощь!

1 Ответ

0 голосов
/ 31 августа 2018

Рассмотрим rapply (функция рекурсивного применения), чтобы сгладить все вложенные дочерние и внучатые элементы внутри lapply, который проходит через три верхних родительских элемента. Затем транспонируйте результат с помощью t() и передайте его в вызов конструктора data.frame().

flat_list <- lapply(my_list, function(x) data.frame(t(rapply(x, function(x) x[1]))))

final_df <- do.call(rbind, unname(flat_list))

выход

final_df

#   X.status X._fa coredata.dc.identifier coredata.document.count coredata.cited.by.count h.index coauthor.count preferred.name.surname preferred.name.given.name
# 1    found  true  AUTHOR_ID:55604964500                       6                      13       3              7            García Cruz            Gustavo Adolfo
# 2    found  true  AUTHOR_ID:56595713900                       4                      21       3              5                 Akimov                    Alexey
# 3    found  true  AUTHOR_ID:12792624600                      10                     117       6              7                 Alecke                     Björn
...