Преобразовать список списков в кадр данных на основе 1 списка - каждый список отличается - PullRequest
1 голос
/ 17 февраля 2020

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

$PMID
[1] "32007943" "32007942" "32007941" "31894091" "31894090"

$Authors
$Authors[[1]]
  LastName  ForeName Initials order
1     Ward  Jordan M       JM     1
2     Hess  Jaclyn N       JN     2
3    Davis Loretta S       LS     3

$Authors[[2]]
  LastName ForeName Initials order
1     Pope  Janet E       JE     1

$Authors[[3]]
  LastName ForeName Initials order
1 Polachek      Ari        A     1
2     Eder     Lihi        L     2

$Authors[[4]]
  LastName ForeName Initials order
1 Milchert   Marcin        M     1
2  Brzosko    Marek        M     2

$Authors[[5]]
  LastName  ForeName Initials order
1  Pascual    Eliseo        E     1
2   Andrés   Mariano        M     2
3   Sivera Francisca        F     3


$Year
[1] 2020 2020 2020 2020 2020

$PublicationType
$PublicationType[[1]]
  PublicationType 
"Journal Article" 

$PublicationType[[2]]
PublicationType 
    "Editorial" 

$PublicationType[[3]]
PublicationType 
    "Editorial" 

$PublicationType[[4]]
  PublicationType 
"Journal Article" 

$PublicationType[[5]]
PublicationType 
    "Editorial" 

Вот то, что я хочу, чтобы эти данные в конечном итоге выглядели. «Авторы» должны быть наблюдениями в кадре данных, но при этом необходимо сохранить структуру, в которой группа Авторы [1] сопоставляется с PMID [1], а Авторы [2] с PMID [2] и т. Д. И т. Д.


  LastName  ForeName Initials order  PMID      Year  Publication_Type
1     Ward  Jordan M       JM     1  32007943  2020  "Journal Article" 
2     Hess  Jaclyn N       JN     2  32007943  2020  "Journal Article" 
3    Davis Loretta S       LS     3  32007943  2020  "Journal Article" 
4     Pope   Janet E       JE     1  32007942  2020  "Editorial" 
5  Polachek      Ari        A     1  32007941  2020  "Editorial" 
6      Eder     Lihi        L     2  32007941  2020  "Editorial" 
7  Milchert   Marcin        M     1  31894091  2020  "Journal Article" 
8   Brzosko    Marek        M     2  31894091  2020  "Journal Article"
9  Pascual    Eliseo        E     1  31894090  2020  "Editorial" 
1   Andrés   Mariano        M     2  31894090  2020  "Editorial" 
11  Sivera Francisca        F     3  31894090  2020  "Editorial" 

Буду очень признателен за любую помощь!

ОБНОВЛЕНИЕ ОБНОВЛЕНИЕ: А. Сулиман опубликовал действительно хорошее решение, но как только я go через 100 извлечений, он вылетает. Очень запутанно. Я просто публикую весь сценарий и вывод:


#install.packages("RISmed")
library(RISmed)

srch_jrheum2020 <- '("The Journal of rheumatology"[Journal]) AND ("2019/01/01"[Date - Publication] : "2020/01/01"[Date - Publication])'

query_jrheum2020 <- EUtilsSummary(
  srch_jrheum2020, 
  retmax=100, 
  mindate= 2000,
  maxdate= 2021,
  datetype = "ppdt")

package_jrheum2020 <- EUtilsGet(query_jrheum2020, type = "efetch", db = "pubmed")

list_jrheum2020 <- list('PMID' = PMID(package_jrheum2020),
                        'Authors' = Author(package_jrheum2020), 
                        'Year' = YearPubmed(package_jrheum2020), 
                        'Month' = MonthPubmed(package_jrheum2020), 
                        'Day' = DayPubmed(package_jrheum2020), 
                        'Journal' = Title(package_jrheum2020),
                        'PublicationType' = PublicationType(package_jrheum2020))

df_jrheum <- pmap_dfr(list_jrheum2020, ~data.frame(
  .y,
  pmid = .x, 
  year = ..3, 
  month = ..4, 
  day = ..5, 
  journal = ..6, 
  type = ..7,
  stringsAsFactors = FALSE))

Так что это прекрасно работает и возвращает именно то, что я хочу:


               LastName          ForeName Initials order     pmid year month day                     journal              type
1               Milchert            Marcin        M     1 31894091 2020     1   3 The Journal of rheumatology   Journal Article
2                Brzosko             Marek        M     2 31894091 2020     1   3 The Journal of rheumatology   Journal Article
3                Pascual            Eliseo        E     1 31894090 2020     1   3 The Journal of rheumatology         Editorial
4                 Andrés           Mariano        M     2 31894090 2020     1   3 The Journal of rheumatology         Editorial
5                 Sivera         Francisca        F     3 31894090 2020     1   3 The Journal of rheumatology         Editorial
6                 Yazici             Yusuf        Y     1 31894089 2020     1   3 The Journal of rheumatology         Editorial
7                 Mankia           Kulveer        K     1 31787610 2019    12   4 The Journal of rheumatology            Letter
8                 Briggs       Christopher        C     2 31787610 2019    12   4 The Journal of rheumatology            Letter
9                  Emery              Paul        P     3 31787610 2019    12   4 The Journal of rheumatology            Letter
10                 Deane           Kevin D       KD     1 31787609 2019    12   4 The Journal of rheumatology   Journal Article
11            Demoruelle         M Kristen       MK     2 31787609 2019    12   4 The Journal of rheumatology   Journal Article
12     Alpizar-Rodriguez           Deshiré        D     1 31787603 2019    12   4 The Journal of rheumatology            Letter
13                Finckh              Axel        A     2 31787603 2019    12   4 The Journal of rheumatology            Letter
14                 Dahal            Lekh N       LN     1 31787598 2019    12   4 The Journal of rheumatology            Letter
15                Barker          Robert N       RN     2 31787598 2019    12   4 The Journal of rheumatology            Letter
16                  Ward           Frank J       FJ     3 31787598 2019    12   4 The Journal of rheumatology            Letter
17                  <NA>              <NA>     <NA>    NA 31787596 2019    12   4 The Journal of rheumatology   Journal Article
18                  <NA>              <NA>     <NA>    NA 31787595 2019    12   4 The Journal of rheumatology   Journal Article
19                  <NA>              <NA>     <NA>    NA 31787595 2019    12   4 The Journal of rheumatology Published Erratum
20                 Rabin            Jeff C       JC     1 31787594 2019    12   4 The Journal of rheumatology   Journal Article
21               Ramirez            Kirsti        K     2 31787594 2019    12   4 The Journal of rheumatology   Journal Article
22                  Owen          Claire E       CE     1 31787593 2019    12   4 The Journal of rheumatology         Editorial
23                  Liew         David F L      DFL     2 31787593 2019    12   4 The Journal of rheumatology         Editorial
24              Buchanan       Russell R C      RRC     3 31787593 2019    12   4 The Journal of rheumatology         Editorial
25             Falasinnu          Titilola        T     1 31787592 2019    12   4 The Journal of rheumatology         Editorial
26                Simard           Julia F       JF     2 31787592 2019    12   4 The Journal of rheumatology         Editorial
27                 Hwang          Steven R       SR     1 31676702 2019    11   5 The Journal of rheumatology            Letter
28              Sawatsky            Adam P       AP     2 31676702 2019    11   5 The Journal of rheumatology            Letter
29             Michelena            Xabier        X     1 31676699 2019    11   5 The Journal of rheumatology            Letter
30         Marco-Pascual             Carla        C     2 31676699 2019    11   5 The Journal of rheumatology            Letter
31      González-Giménez            Xavier        X     3 31676699 2019    11   5 The Journal of rheumatology            Letter
32               Juanola            Xavier        X     4 31676699 2019    11   5 The Journal of rheumatology            Letter

По какой-то безумной причине, если я ударю Часть «retmax» функции EUtilsSummary после 100 Я получаю эту ошибку:


> df_jrheum <- pmap_dfr(list_jrheum2020, ~data.frame(
+   .y,
+   pmid = .x, 
+   year = ..3, 
+   month = ..4, 
+   day = ..5, 
+   journal = ..6, 
+   type = ..7,
+   stringsAsFactors = FALSE))
Error in data.frame(.y, pmid = .x, year = ..3, month = ..4, day = ..5,  : 
  arguments imply differing number of rows: 4, 1, 3
In addition: There were 50 or more warnings (use warnings() to see the first 50)
> 
> warnings()
Warning messages:
1: In data.frame(.y, pmid = .x, year = ..3, month = ..4,  ... :
  row names were found from a short variable and have been discarded
2: In data.frame(.y, pmid = .x, year = ..3, month = ..4,  ... :
  row names were found from a short variable and have been discarded
3: In data.frame(.y, pmid = .x, year = ..3, month = ..4,  ... :
  row names were found from a short variable and have been discarded

Есть также досадные предупреждения о отбрасывании строк, но это кажется менее значимым.

1 Ответ

2 голосов
/ 17 февраля 2020

Учитывая, что элементы списка имеют одинаковую длину, мы можем использовать от purrr::pmap до l oop параллельно, а затем связать элементы, используя data.frame

purrr::pmap_dfr(lst_tmp, ~data.frame(.y, PMID=.x, year=..3, PublicationType=..4, 
                                     stringsAsFactors = FALSE))

   mpg cyl  disp  hp drat    wt  qsec vs am gear carb PMID year PublicationType
1 21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4    1 2020 Journal Article
2 21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4    1 2020 Journal Article
3 22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1    1 2020 Journal Article
4 15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8    2 2021      Journal Ed
5 21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2    2 2021      Journal Ed
6 19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4    3 2022         Journal
7 17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4    3 2022         Journal
8 16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3    3 2022         Journal

Данные

lst_tmp <- list(PMID=c(1,2,3), Authors=list(head(mtcars, 3), tail(mtcars, 2), mtcars[10:12, ]), year=c(2020,2021,2022), 
           PublicationType=list(c(PublicationType="Journal Article"), c(PublicationType="Journal Ed"), c(PublicationType="Journal")))

Обновление:

#With retmax=200 we got some PublicationType with more than one type, e.g list_jrheum2020$PublicationType[[9]], so we can do
paste(list_jrheum2020$PublicationType[[9]], collapse = "-")
#or if you are interset in the first element 
list_jrheum2020$PublicationType[[9]][[1]]

#therefore we can try 
pmap_dfr(list_jrheum2020, ~data.frame(
    .y,
    pmid = .x, 
    year = ..3, 
    month = ..4, 
    day = ..5, 
    journal = ..6, 
    type = paste(..7, collapse = "-"),
    stringsAsFactors = FALSE))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...