Существует множество примеров преобразования списка именованных векторов в 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
Rainer 10 Ноя 2020 в 15:56

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
0
Allan Cameron 10 Ноя 2020 в 13:06

Получите уникальные имена, а затем подмножество исходного списка. Когда в списке нет этого элемента, он возвращает 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
1
zx8754 10 Ноя 2020 в 13:46