2010-06-07 21 views
30

Tengo un vector de listas y uso unlist en ellas. Algunos de los elementos en los vectores son NULL y unlist parece estar soltándolos.Evitar que la lista deje caer valores NULOS

¿Cómo puedo evitar esto?

Aquí está un ejemplo sencillo (no) de trabajo que muestra esta característica no deseada de unlist

a = c(list("p1"=2, "p2"=5), 
     list("p1"=3, "p2"=4), 
     list("p1"=NULL, "p2"=NULL), 
     list("p1"=4, "p2"=5)) 
unlist(a) 
p1 p2 p1 p2 p1 p2 
2 5 3 4 4 5 

Respuesta

15

El problema aquí es que no se puede tener NULL en medio de un vector. Por ejemplo:

> c(1,NULL,3) 
[1] 1 3 

Aunque puede tener NA en el medio. Se podría podría convertirlo en personaje y luego volver a numérico, que convierte automáticamente los valores NULL a NA (con una advertencia):

> b <- as.numeric(as.character(a)) 
Warning message: 
NAs introduced by coercion 

a continuación, poner los nombres de nuevo, debido a que han sido descartados por el anterior operación:

> names(b) <- names(a) 
> b 
p1 p2 p1 p2 p1 p2 p1 p2 
2 5 3 4 NA NA 4 5 ` 
+2

En 3.2.2, parece que as.numeric (as.character (NULL)) devuelve numérico (0). Un nuevo enfoque podría ser usar lapply (b, function (x) ifelse (is.null (x), NA, x)) – cylondude

1

La forma correcta de indicar que falta un valor es NA (no NULO). Aquí es otra versión que está trabajando:

a = c(list("p1"=2, "p2"=5), 
     list("p1"=3, "p2"=4), 
     list("p1"=NA, "p2"=NA), 
     list("p1"=4, "p2"=5)) 
    unlist(a) 

p1 p2 p1 p2 p1 p2 p1 p2 
2 5 3 4 NA NA 4 5 
+1

gracias por la respuesta. Obviamente no defino la lista a mano, la devuelve una función. De todos modos, cambiar los valores NULL a NA antes de 'unlist' parecía hacer el truco. – nico

+0

@nico Si es su función, entonces podría considerar reescribirla para devolver 'NA' en lugar de' NULL'. eche un vistazo a las páginas de ayuda a 'NA' y' NULL' para ver las diferencias entre estos dos objetos. – Marek

+1

@Marek: No, en realidad es una lista devuelta al aplicar 'coef' en una lista de objetos devueltos por' nls'. Algunos de estos objetos son NULL y 'coef (NULL)' devuelve 'NULL' ... – nico

29

En este caso (lista de profundidad de una sola planta) Esto debería también funciona:

a[sapply(a, is.null)] <- NA 
unlist(a) 
# p1 p2 p1 p2 p1 p2 p1 p2 
# 2 5 3 4 NA NA 4 5 
1

Si se trata de un JSON largo y complejo, con varios niveles que debiera pruébelo:

Extraje datos de registro del juego del sitio web nba.com/stats. El problema es que algunos jugadores tienen un valor NULL para 3 puntos de tiros libres (en su mayoría) y los centros de jsonlite :: fromJSON parece manejar valores NULL muy bien:

#### Player game logs URL: one record per player per game played #### 
gameLogsURL <- paste("http://stats.nba.com/stats/leaguegamelog?Counter=1000&Direction=DESC&LeagueID=00&PlayerOrTeam=P&Season=2016-17&SeasonType=Regular+Season&Sorter=PTS") 

#### Import game logs data from JSON #### 
# use jsonlite::fromJSON to handle NULL values 
gameLogsData <- jsonlite::fromJSON(gameLogsURL, simplifyDataFrame = TRUE) 
# Save into a data frame and add column names 
gameLogs <- data.frame(gameLogsData$resultSets$rowSet) 
colnames(gameLogs) <- gameLogsData$resultSets$headers[[1]] 
Cuestiones relacionadas