valores studio perdidos omitir nulos filas eliminar elemento datos data con casos r

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] .