Преобразование списка 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>
но это довольно неприятно, и числовая переменная становится фактором...
Ответы
Ответ 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))