insertar - Convierta la lista R a un marco de datos con elementos faltantes/NULL
list to data frame r (2)
En un comentario se menciona que solo se desea un solo bucle, que se puede lograr con la respuesta de @ flodel simplemente al juntar el cuerpo de los dos bucles:
rbind.fill(lapply(alist, function(f) {
as.data.frame(Filter(Negate(is.null), f))
}))
dando
name age
1 Foo 22
2 Bar NA
3 Baz NA
Dada una lista:
alist = list(
list(name="Foo",age=22),
list(name="Bar"),
list(name="Baz",age=NULL)
)
¿Cuál es la mejor manera de convertir esto en un marco de datos con columnas de nombre y edad, con valores faltantes (aceptaré NA o "" en ese orden de preferencia)?
Los métodos simples que usan ldply
fallan porque intenta convertir cada elemento de lista en un marco de datos, pero el que tiene los barfs NULOS porque las longitudes no coinciden. Lo mejor que tengo en este momento es:
> ldply(alist,function(s){t(data.frame(unlist(s)))})
name age
1 Foo 22
2 Bar <NA>
3 Baz <NA>
pero eso es bastante icky y la variable numérica se convierte en un factor ...
Paso 1: eliminar elementos NULL
non.null.list <- lapply(alist, Filter, f = Negate(is.null))
Paso 2: apilar todo junto:
library(plyr)
rbind.fill(lapply(non.null.list, as.data.frame))
# name age
# 1 Foo 22
# 2 Bar NA
# 3 Baz NA
Edición : En caso de que tuviera una variable que sea NULL
para todos los elementos de su lista, no se mostraría en su salida final. Si, por el contrario, desea una columna con NA
, el primer paso no debe eliminar NULL
s, sino reemplazarlos con NA
s:
Paso 1 alternativa: reemplazar NULL
con NA
:
non.null.list <- lapply(alist, lapply, function(x)ifelse(is.null(x), NA, x))