Determinar el número de valores de NA en una columna


142

Quiero contar el número de NAvalores en una columna de marco de datos. Digamos que mi marco de datos se llama df, y el nombre de la columna que estoy considerando es col. La forma en que se me ocurrió es la siguiente:

sapply(df$col, function(x) sum(length(which(is.na(x)))))  

¿Es esta una forma buena / más eficiente de hacer esto?

Respuestas:


315

Estás pensando demasiado el problema:

sum(is.na(df$col))

Gracias por esto. Para ampliar esto un poco. Al contar la cantidad de arbitrario value, aparte de NAescribir una función booleana is.valuey luego usar sum(is.value(df$col))el camino a seguir o ¿hay una sintaxis directa más concisa para esto?
user3274289

3
Fue demasiado rápido para preguntar. sum(df$col==value,na.rm=FALSE)Hace el truco.
user3274289

44
@ user3274289: aunque generalmente querrá na.rm=TRUE, porque de lo contrario si df$colcontiene NA, sumvolverá NA.
jbaums

1
A veces creo que estoy pensando demasiado, hasta que recibí esta respuesta ... bueno, es verdad ...
Rugal

lo siento pero esto no funciona para mí Recibo esta advertencia Mensaje de advertencia: En is.na (nom $ wd): is.na () se aplica a no (lista o vector) de tipo 'NULL', y el recuento es solo cero.
Herman Toothrot

77

Si está buscando NArecuentos para cada columna en un marco de datos, entonces:

na_count <-sapply(x, function(y) sum(length(which(is.na(y)))))

debería darle una lista con los recuentos de cada columna.

na_count <- data.frame(na_count)

Debería dar salida a los datos muy bien en un marco de datos como:

----------------------
| row.names | na_count
------------------------
| column_1  | count

1
Para incluir los nombres de fila como una columna, también ejecute na_count$name<-rownames(na_count).
Matt

66
na_count <-sapply(x, function(y) sum(is.na(y)))Es una alternativa más corta.
Vincent Bonhomme

1
No funcionó para mí :( Tuve que cambiarlo a: na_count <- apply (x, function (y) sum (is.na (y)), MARGIN = 2)
Angel Garcia Campos

¿No creo que necesitemos usar tanto la función de suma como la de longitud (en la primera asignación de na_count)? Solo la longitud debería ser suficiente.
Yandle

39

Prueba la colSumsfunción

df <- data.frame(x = c(1,2,NA), y = rep(NA, 3))

colSums(is.na(df))

#x y 
#1 3 

18

Si desea contar el número de NA en todo el marco de datos, también puede usar

sum(is.na(df))

13

En la summary()salida, la función también cuenta los NAs para poder usar esta función si desea la suma de NAs en varias variables.


2
Vale la pena señalar que la summarysalida cuando se usa en una sola columna es utilizable, mientras que su salida de un marco de datos completo es de carácter y los recuentos son difíciles de extraer si los necesita más adelante. Ver c(summary(mtcars)).
Rich Scriven

9

Una forma ordenada de contar el número de nulos en cada columna de un marco de datos:

library(tidyverse)
library(purrr)

df %>%
    map_df(function(x) sum(is.na(x))) %>%
    gather(feature, num_nulls) %>%
    print(n = 100)

3
Ni siquiera necesitas ronronear:df %>% summarise_all(funs(sum(is.na(.))))
David Bruce Borenstein

Si eres flojo como yo, puedes escribir lo mismo en la respuesta de @Abi K en la sintaxis de df %>% map_df(~sum(is.na(.)))ronroneo algo más corta como: o sin dplyr comomap_df(~sum(is.na(df)))
Agile Bean

7

Esta forma, ligeramente cambiada de la de Kevin Ogoros:

na_count <-function (x) sapply(x, function(y) sum(is.na(y)))

devuelve NA cuenta como una matriz int


para obtener el resultado como lista:na_count <-function (x) lapply(x, function(y) sum(is.na(y)))
hute37

6

Una solución rápida y fácil de Tidyverse para obtener un NArecuento de todas las columnas es usar, summarise_all()lo que creo que hace que sea una solución mucho más fácil de leer que usar purrrosapply

library(tidyverse)
# Example data
df <- tibble(col1 = c(1, 2, 3, NA), 
             col2 = c(NA, NA, "a", "b"))

df %>% summarise_all(~ sum(is.na(.)))
#> # A tibble: 1 x 2
#>    col1  col2
#>   <int> <int>
#> 1     1     2


3

La respuesta del usuario rrs es correcta, pero eso solo le indica el número de valores de NA en la columna particular del marco de datos que está pasando para obtener el número de valores de NA para todo el marco de datos. Intente esto:

apply(<name of dataFrame>, 2<for getting column stats>, function(x) {sum(is.na(x))})

Esto hace el truco


Hay algunos errores tipográficos que hacen que este código no sea funcional. Prueba esto; apply(df, 2, function(x) sum(is.na(x)))
user3495945

3

Leí un archivo csv del directorio local. El siguiente código funciona para mí.

# to get number of which contains na
sum(is.na(df[, c(columnName)]) # to get number of na row

# to get number of which not contains na
sum(!is.na(df[, c(columnName)]) 

#here columnName is your desire column name

2

Similar a la respuesta de hute37 pero usando el purrrpaquete. Creo que este enfoque tidyverse es más simple que la respuesta propuesta por AbiK.

library(purrr)
map_dbl(df, ~sum(is.na(.)))

Nota: tilde ( ~) crea una función anónima. Y el '.' se refiere a la entrada para la función anónima, en este caso el data.frame df.


0

Puede usar esto para contar el número de NA o espacios en blanco en cada columna

colSums(is.na(data_set_name)|data_set_name == '')

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.