R: Как «разложить» вложенный список в data.frame? - PullRequest
1 голос
/ 06 августа 2020

У меня есть

l1 = list(SeriousDlqin2yrs = list(prediction = "0", prediction_probs = list(`0` = 0.5, `1` = 0.5)))
l2 = list(SeriousDlqin2yrs = list(prediction = "1", prediction_probs = list(`0` = 0.6, `1` = 0.4)))

l12 = list(l1, l2)

data.frame.output = l12 %>% 
  purrr::reduce(dplyr::bind_rows) %>% 
  unnest(cols = c("SeriousDlqin2yrs", "0", "1"))

, и я ожидаю такой фрейм данных (выраженный в формате CSV)

SeriousDlqin2yrs$prediction, SeriousDlqin2yrs$prediction$0, SeriousDlqin2yrs$prediction$1
0, 0.5, 0.5
0, 0.6, 0.4

Предпочтительно мне понадобится решение, в котором оно работает независимо от имен в список.

Ответы [ 3 ]

4 голосов
/ 06 августа 2020

Можно:

purrr::map_dfr(l12, unlist)

# A tibble: 2 x 3
#  SeriousDlqin2yrs.prediction SeriousDlqin2yrs.prediction_probs.0 SeriousDlqin2yrs.prediction_probs.1
#  <chr>                       <chr>                               <chr>                              
#1 0                           0.5                                 0.5                                
#2 1                           0.6                                 0.4                   

Или в базе R:

as.data.frame(do.call(rbind, lapply(l12, unlist)))
2 голосов
/ 06 августа 2020

Мы также могли бы использовать as.data.frame, и это получит правильный тип

out <- map_dfr(l12, as.data.frame)
str(out)
#'data.frame':  2 obs. of  3 variables:
# $ SeriousDlqin2yrs.prediction        : chr  "0" "1"
# $ SeriousDlqin2yrs.prediction_probs.0: num  0.5 0.6
# $ SeriousDlqin2yrs.prediction_probs.1: num  0.5 0.4

Или в base R

do.call(rbind, lapply(l12, as.data.frame))
#  SeriousDlqin2yrs.prediction SeriousDlqin2yrs.prediction_probs.0 SeriousDlqin2yrs.prediction_probs.1
#1                           0                                 0.5                                 0.5
#2                           1                                 0.6                                 0.4
0 голосов
/ 06 августа 2020

Вышеуказанное верно, но использование {rlist} сохраняет правильность типа

library(rlist)

purrr::map_dfr(l12, rlist::list.flatten)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...