Преобразование списка 1 уровня с нерегулярными элементами во фрейм данных - PullRequest
0 голосов
/ 23 февраля 2019

Я ищу простое решение выше.Кажется, я часто сталкиваюсь с этой проблемой, когда API возвращают JSON, который впоследствии преобразуется в список.

Представляет данные:

result_head <- list(list(name = "JEFFREY", gender = "male", probability = 1L, 
count = 932L), list(name = "Jan", gender = "male", probability = 0.6, 
count = 1663L), list(name = "Elquis", gender = NULL), list(
name = "ELQUIS", gender = NULL), list(name = "Francisco", 
gender = "male", probability = 1L, count = 1513L))

Задача состоит в том, чтобы максимально просто преобразовать это вфрейм данных из 5 строк.Учитывая, что элементы в каждом элементе списка являются нерегулярными, необходимо ввести NA s для отсутствующих элементов, аналогично тому, как bind_rows работает при укладке фреймов данных с нерегулярными столбцами.

Что я пробовал:

map_dfr(result, bind_rows)

do.call(bind_rows, result_head)

flatten(result_head)

bind_rows(flatten(result_head))

Я задал похожий вопрос здесь: Извлечение во фрейм данных из сгенерированного JSON многоуровневого списка со случайными недостающими элементами

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

Я бы хотел решение, которое, как мы надеемся, будет элегантным - я часто сталкиваюсь с такого рода операциями, и, тем не менее, нет единого путиделать это с несколькими уровнями функциональной абстракции.

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

Спасибо.

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

Вот еще один вариант с map после flatten и преобразованием в tibble

library(tidyverse)
map_df(result_head, ~ flatten(.x) %>%
                as_tibble)
# A tibble: 5 x 4
#  name      gender probability count
#  <chr>     <chr>        <dbl> <int>
#1 JEFFREY   male           1     932
#2 Jan       male           0.6  1663
#3 Elquis    <NA>          NA      NA
#4 ELQUIS    <NA>          NA      NA
#5 Francisco male           1    1513

Или как @ G.Groethendieck, упомянутый в комментариях

map_dfr(result_head, flatten)
0 голосов
/ 23 февраля 2019
library(purrr) # transpose and map_if
library(rlist) # list.stack

result_head <- list(
  list(name = "JEFFREY", gender = "male", probability = 1L, count = 932L), 
  list(name = "Jan", gender = "male", probability = 0.6, count = 1663L), 
  list(name = "Elquis", gender = NULL), 
  list(name = "ELQUIS", gender = NULL), 
  list(name = "Francisco", gender = "male", probability = 1L, count = 1513L)
)

list.stack(transpose(
  lapply(transpose(result_head), function(y) map_if(y, is.null, function(x) NA))
))

       name gender probability count
1   JEFFREY   male         1.0   932
2       Jan   male         0.6  1663
3    Elquis   <NA>          NA    NA
4    ELQUIS   <NA>          NA    NA
5 Francisco   male         1.0  1513
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...