Список названных списков в 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