Преобразовать список именованных векторов с отсутствующими объектами в данные.фрейм

#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 функции и, следовательно, хорошо вписывается в имеющийся у меня код.