Список названных списков в data.frame

У меня есть список названных списков следующей формы из объекта JSON:

my_list = list(list(a = 10, b = "blah"), 
               list(a = 15, b = "stuff"))

Каждый элемент внешнего списка является именованным списком, и я хочу преобразовать его в файл data.frame следующей формы с именами столбцов:

a   b 
10  "blah" 
15  "stuff"

На поверхности, я могу добиться этого, выполнив to_df = data.frame(do.call(rbind, my_list)).

Однако, если бы я попытался извлечь отдельный столбец, используя to_df$a или to_df[,1], я бы получил список вместо вектора, как обычно ожидалось из data.frame:

> to_df[,1]
[[1]]
[1] 10

[[2]]
[1] 15

Вместо:

> to_df[,1]
[1] 10 15

В старой почте в списке рассылки R было предложено следующее решение: to_df = as.data.frame(t(sapply(my_list, rbind))). Но не только это не передается по именам столбцов, но по-прежнему имеет ту же проблему возврата списка вместо вектора при просмотре отдельных столбцов с помощью to_df[,1].

Какой лучший способ достичь этого? Есть ли способ dplyr?

EDIT: спасибо за все решения, кажется, что трюк - это lapply и преобразовать каждый элемент списка в data.frame, а затем связать их вместе с помощью dplyr или do.call. Альтернативно, data.table выполняет большую часть работы с одним вызовом rbindlist.

Ответ 1

Я предпочитаю rbindlist из пакета data.table. Он простой, быстрый и возвращает фрейм/таблицу данных.

data.table::rbindlist(my_list)
#     a     b
# 1: 10  blah
# 2: 15 stuff

Другим преимуществом rbindlist() является то, что он автоматически заполнит отсутствующие значения с помощью NA.

Чтобы удалить класс data.table, вы можете просто вставить as.data.frame()

as.data.frame(data.table::rbindlist(my_list))

Ответ 2

В базе R вы можете сделать

df<-do.call(rbind,lapply(my_list,data.frame))

Ответ 3

Похоже, вы можете сделать это с помощью bind_rows из версии разработки dplyr, dplyr_0.4.2.9002, начиная с двух дней назад.

library(dplyr)
bind_rows(my_list)

Source: local data frame [2 x 2]

   a     b
1 10  blah
2 15 stuff