Преобразовать список списков во фрейм данных, сохраняя имена и все столбцы - PullRequest
1 голос
/ 15 октября 2019

Я хотел бы преобразовать химические формулы во фрейм данных, содержащий столбцы для 1) названия минерала, 2) химической формулы и 3) набора столбцов для каждого элемента, извлеченного из формулы. Мне даны первые два столбца, и я могу извлечь количество элементов из каждой формулы, используя CHNOSZ :: make (). Однако я не знаком с работой со списками и не уверен, как выполнить rbind () списков обратно во фрейм данных, который содержит все, что я ищу (т.е. см. 1-3 выше).

Вотчто я имею до сих пор - благодарен за любую помощь (включая ссылку на хороший учебник о том, как преобразовать данные из вложенных списков в рамки данных).

library(tidyverse)
library(CHNOSZ)

formulas <- structure(list(Mineral = c("Abelsonite", "Abernathyite", "Abhurite", 
"Abswurmbachite", "Acanthite", "Acetamide"), Composition = c("C31H32N4Ni", 
"K(UO2)(AsO4)4(H2O)", "Sn3O(OH)2Cl2", "CuMn6(SiO4)O8", "Ag2S", 
"CH3CONH2")), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-6L))

test <-  formulas %>% 
  select(Composition) %>% 
  map(CHNOSZ::makeup) %>%
  flatten

test2 <- do.call(rbind,test)

    > test2
     As  H  K  O  U
[1,] 31 32  4  1 31
[2,]  4  2  1 19  1
[3,]  2  2  3  3  2
[4,]  1  6 12  1  1
[5,]  2  1  2  1  2
[6,]  2  5  1  1  2

, что неправильно.

1 Ответ

2 голосов
/ 15 октября 2019

Вы могли бы сделать что-то вроде этого

library(tidyverse)
library(CNOSZ)
test <-  formulas %>%
    mutate(res = map(Composition, ~stack(makeup(.x)))) %>%
    unnest(cols = res) %>%
    spread(ind, values)
## A tibble: 6 x 17
#  Mineral Composition     C     H     N    Ni    As     K     O     U    Cl
#  <chr>   <chr>       <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 Abelso… C31H32N4Ni     31    32     4     1    NA    NA    NA    NA    NA
#2 Aberna… K(UO2)(AsO…    NA     2    NA    NA     4     1    19     1    NA
#3 Abhuri… Sn3O(OH)2C…    NA     2    NA    NA    NA    NA     3    NA     2
#4 Abswur… CuMn6(SiO4…    NA    NA    NA    NA    NA    NA    12    NA    NA
#5 Acanth… Ag2S           NA    NA    NA    NA    NA    NA    NA    NA    NA
#6 Acetam… CH3CONH2        2     5     1    NA    NA    NA     1    NA    NA
## … with 6 more variables: Sn <dbl>, Cu <dbl>, Mn <dbl>, Si <dbl>, Ag <dbl>,
##   S <dbl>
...