Преобразование списка R в dataframe с отсутствующими /NULL элементами - программирование
Подтвердить что ты не робот

Преобразование списка R в dataframe с отсутствующими /NULL элементами

Учитывая список:

alist = list(
  list(name="Foo",age=22),
  list(name="Bar"),
  list(name="Baz",age=NULL)
 )

какой лучший способ преобразовать это в фреймворк с именами и возрастными столбцами с отсутствующими значениями (я буду принимать NA или "" в этом порядке предпочтения)?

Простые методы, использующие ldply, терпят неудачу, потому что он пытается преобразовать каждый элемент списка в фрейм данных, а тот, у которого есть NULL barfs, потому что длины не совпадают. Лучшее, что у меня есть на данный момент:

> ldply(alist,function(s){t(data.frame(unlist(s)))})
  name  age
1  Foo   22
2  Bar <NA>
3  Baz <NA>

но это довольно неприятно, и числовая переменная становится фактором...

4b9b3361

Ответ 1

В комментарии упоминается только один цикл, который может быть достигнут с помощью @flolel answer, просто объединив тело двух петель:

rbind.fill(lapply(alist, function(f) {
  as.data.frame(Filter(Negate(is.null), f))
}))

дает

  name age
1  Foo  22
2  Bar  NA
3  Baz  NA

Ответ 2

Шаг1: удалите элементы NULL

non.null.list <- lapply(alist, Filter, f = Negate(is.null))

Шаг 2: соединить все вместе:

library(plyr)
rbind.fill(lapply(non.null.list, as.data.frame))
#   name age
# 1  Foo  22
# 2  Bar  NA
# 3  Baz  NA

Изменить. Если у вас есть переменная NULL для всех элементов списка, она не будет отображаться в вашем конечном выпуске. Если вместо этого вам понадобится столбец с NA, первый шаг не должен удалять NULL, а заменить их на NA s:

Шаг 1: замените NULL на NA:

non.null.list <- lapply(alist, lapply, function(x)ifelse(is.null(x), NA, x))