#r #type-conversion
#r #тип-преобразование
Вопрос:
Существует много примеров преобразования списка именованных векторов в a data.frame
, но все они предполагают, что вектор в каждом элементе списка имеет одинаковые имена. У меня ситуация, когда не у всех есть все именованные элементы. Пример:
x <- list(
a = c(id = "one", name = "Robert", remarks = "none" ),
b = c(id = "two", name = "Edgar" ),
c = c(id = "three", name = "Edward", remarks = "stupid")
)
Теперь я хотел бы иметь data.frame
(без использования dplyr), как если бы отсутствующее замечание было NA
:
x <- list(
a = c(id = "one", name = "Robert", remarks = "none" ),
b = c(id = "two", name = "Edgar", remarks = NA ),
c = c(id = "three", name = "Edward", remarks = "stupid")
)
as.data.frame(x)
вот так
a b c
id one two three
name Robert Edgar Edward
remarks none <NA> stupid
Есть ли простой способ, или мне нужно развернуть свою собственную функцию (без проблем, но если есть функция, мне не нужно).
Ответ №1:
Получить уникальные имена, затем подмножество исходного списка. Когда в списке нет этого элемента, он возвращает NA, это гарантирует, что все длины одинаковы, затем мы преобразуем в data.frame:
xNames <- unique(unlist(sapply(x, names)))
data.frame(lapply(x, "[", xNames))
# a b c
# id one two three
# name Robert Edgar Edward
# remarks none <NA> stupid
Ответ №2:
В базе R вы могли бы сделать:
cols <- unique(unlist(sapply(x, names)))
as.data.frame(do.call(cbind, lapply(x, function(y) setNames(y[cols], cols))))
#> a b c
#> id one two three
#> name Robert Edgar Edward
#> remarks none <NA> stupid
Комментарии:
1. Спасибо. Я предпочитаю этот, поскольку он также использует
as.data.frame
функции и, следовательно, хорошо вписывается в имеющийся у меня код.