studio - omitir datos na en r
R: eliminar elementos NULL de una lista (6)
Aquí está con conveniente notación de encadenamiento.
library(magrittr)
mylist %>%
setNames(seq_along(.)) %>%
Filter(. %>% is.null %>% `!`, .)
mylist <- list(NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
123, NULL, 456)
> mylist
[[1]]
NULL
[[2]]
NULL
[[3]]
NULL
[[4]]
NULL
[[5]]
NULL
[[6]]
NULL
[[7]]
NULL
[[8]]
NULL
[[9]]
NULL
[[10]]
NULL
[[11]]
[1] 123
[[12]]
NULL
[[13]]
[1] 456
Mi lista tiene 13 elementos, 11 de los cuales son NULL. Me gustaría eliminarlos, pero preservar los índices de los elementos que no están vacíos.
mylist2 = mylist[-which(sapply(mylist, is.null))]
> mylist2
[[1]]
[1] 123
[[2]]
[1] 456
Esto elimina los elementos NULL muy bien, pero no quiero que los elementos no vacíos se vuelvan a indexar, es decir, quiero que mylist2
vea algo así, donde se conservan los índices de las entradas no vacías.
> mylist2
[[11]]
[1] 123
[[13]]
[1] 456
Aquí hay una manera muy simple de hacerlo usando solo las funciones de base R:
names(mylist) <- 1:length(mylist)
mylist2 <- mylist[which(!sapply(mylist, is.null))]
Hay una función que elimina automáticamente todas las entradas nulas de una lista y, si se nombra a la lista, mantiene los nombres de las entradas que no son nulas.
Esta función se llama compact
del paquete plyr
.
l <- list( NULL, NULL, foo, bar)
names(l) <- c( "one", "two", "three", "four" )
plyr::compact(l)
Si desea conservar los índices de las entradas no nulas, puede asignar un nombre a la lista como se hace en la publicación anterior y luego compactar su lista:
names(l) <- seq_along(l)
plyr::compact(l)
Lo más cercano que podrá obtener es nombrar primero los elementos de la lista y luego eliminar los NULL.
names(x) <- seq_along(x)
## Using some higher-order convenience functions
Filter(Negate(is.null), x)
# $`11`
# [1] 123
#
# $`13`
# [1] 456
# Or, using a slightly more standard R idiom
x[sapply(x, is.null)] <- NULL
x
# $`11`
# [1] 123
#
# $`13`
# [1] 456
Si quieres mantener los nombres puedes hacerlo.
a <- list(NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
123, NULL, 456)
non_null_names <- which(!sapply(a, is.null))
a <- a[non_null_names]
names(a) <- non_null_names
a
A continuación, puede acceder a los elementos como tal
a[[''11'']]
num <- 11
a[[as.character(num)]]
a[[as.character(11)]]
a$`11`
Sin embargo, no puede obtenerlos en la notación [[11]]
, [[13]]
, porque representan índices numéricos.
Simplemente haga mylist[lengths(mylist) != 0]
.