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?

usuario3274289
fuente

Respuestas:

315

Estás pensando demasiado el problema:

sum(is.na(df$col))
rrs
fuente
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
Kevin Ogoro
fuente
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 
Tony Ladson
fuente
18

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

sum(is.na(df))
bkielstr
fuente
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.

Shahin
fuente
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)
Abi K
fuente
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

hute37
fuente
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
Moohan
fuente
3

Prueba esto:

length(df$col[is.na(df$col)])
Rabish kumar Singh
fuente
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

iec2011007
fuente
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
reza.cse08
fuente
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.

Chris Kiniry
fuente
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 == '')
Prakhar Srivastava
fuente
0
sapply(name of the data, function(x) sum(is.na(x)))
UTKARSH
fuente
Consulte " Explicación de respuestas completamente basadas en código ". Si bien esto podría ser técnicamente correcto, no explica por qué resuelve el problema o debería ser la respuesta seleccionada. Deberíamos educar además para ayudar a resolver el problema.
El hombre de hojalata