Determinar o número de valores de NA em uma coluna

142

Eu quero contar o número de NAvalores em uma coluna de quadro de dados. Digamos que meu quadro de dados seja chamado dfe o nome da coluna que estou considerando seja col. A maneira como inventei é a seguinte:

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

Essa é uma maneira boa / mais eficiente de fazer isso?

user3274289
fonte

Respostas:

314

Você está pensando demais no problema:

sum(is.na(df$col))
rrs
fonte
Obrigado por isso. Para expandir isso um pouco. Contando uma quantidade arbitrária value, além de NAescrever uma função booleana is.valuee depois usar sum(is.value(df$col))o caminho a seguir, ou existe uma sintaxe direta mais concisa para isso?
user3274289
3
Foi rápido demais para perguntar. sum(df$col==value,na.rm=FALSE)faz o truque.
user3274289
4
@ user3274289: embora você normalmente deseje na.rm=TRUE, caso contrário, se df$colcontém NAs, sumretornará NA.
precisa saber é
1
Às vezes eu acho que sou excesso de pensamento, até que eu tenho essa resposta ... bem, é verdade ...
Rugal
desculpe, mas isso não funciona para mim. Recebo esse aviso Mensagem de aviso: Em is.na (nom $ wd): is.na () aplicado a não (lista ou vetor) do tipo 'NULL' e a contagem é zero.
Herman Toothrot 16/03/16
77

Se você estiver procurando NAcontagens para cada coluna em um quadro de dados, então:

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

deve fornecer uma lista com as contagens para cada coluna.

na_count <- data.frame(na_count)

Deverá gerar os dados adequadamente em um quadro de dados como:

----------------------
| row.names | na_count
------------------------
| column_1  | count
Kevin Ogoro
fonte
1
Para incluir os nomes das linhas como uma coluna, também execute na_count$name<-rownames(na_count).
Matt
6
na_count <-sapply(x, function(y) sum(is.na(y)))é uma alternativa mais curta.
Vincent Bonhomme 26/03
1
Não funcionou para mim :( Tive de alterá-lo para: na_count <- aplicar (x, função (y) soma (is.na (y)), MARGEM = 2)
Angel Garcia Campos
Eu não acho que precisamos usar a função sum e a length (na primeira atribuição na_count)? Apenas o comprimento deve ser suficiente.
Yandle 02/02/19
39

Experimente a colSumsfunção

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

colSums(is.na(df))

#x y 
#1 3 
Tony Ladson
fonte
18

Se você deseja contar o número de NAs em todo o quadro de dados, também pode usar

sum(is.na(df))
bkielstr
fonte
13

Na summary()saída, a função também conta os NAs, para que você possa usar essa função se quiser a soma de NAs em várias variáveis.

Shahin
fonte
2
Vale ressaltar que a summarysaída quando usada em uma única coluna é utilizável, enquanto a saída de um quadro de dados inteiro é caractere e as contagens são difíceis de extrair se você precisar delas mais tarde. Veja c(summary(mtcars)).
Rich Scriven
9

Uma maneira organizada de contar o número de nulos em todas as colunas de um quadro de dados:

library(tidyverse)
library(purrr)

df %>%
    map_df(function(x) sum(is.na(x))) %>%
    gather(feature, num_nulls) %>%
    print(n = 100)
Abi K
fonte
3
Você nem precisa ronronar:df %>% summarise_all(funs(sum(is.na(.))))
David Bruce Borenstein
Se você é preguiçoso como eu, você pode escrever o mesmo em resposta de @Abi K na sintaxe purrr um pouco mais curto como: df %>% map_df(~sum(is.na(.)))ou sem dplyr comomap_df(~sum(is.na(df)))
Agile Feijão
7

Este formulário mudou ligeiramente do de Kevin Ogoros:

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

retorna contagens de NA como nomeado int array

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

Uma solução rápida e fácil do Tidyverse para obter uma NAcontagem para todas as colunas é usar, o summarise_all()que eu acho que torna muito mais fácil ler a solução do que usar purrrousapply

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
fonte
3

Tente o seguinte:

length(df$col[is.na(df$col)])
Rabish kumar Singh
fonte
3

A resposta do usuário rrs está correta, mas isso informa apenas o número de valores de NA na coluna específica do quadro de dados que você está passando para obter o número de valores de NA para todo o quadro de dados, tente o seguinte:

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

Isso faz o truque

iec2011007
fonte
Existem alguns erros de digitação que tornam esse código não funcional. Tente isso; apply(df, 2, function(x) sum(is.na(x)))
user3495945
3

Eu li um arquivo csv do diretório local. O código a seguir funciona para mim.

# 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
fonte
2

Semelhante à resposta do hute37, mas usando o purrrpacote. Penso que esta abordagem ordenada é mais simples do que a resposta proposta por AbiK.

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

Nota: o til ( ~) cria uma função anônima. E a '.' refere-se à entrada da função anônima, neste caso o data.frame df.

Chris Kiniry
fonte
0

Você pode usar isso para contar o número de NA ou espaços em branco em todas as colunas

colSums(is.na(data_set_name)|data_set_name == '')
Prakhar Srivastava
fonte
0
sapply(name of the data, function(x) sum(is.na(x)))
UTKARSH
fonte
Consulte " Explicando respostas inteiramente baseadas em código ". Embora isso possa estar tecnicamente correto, não explica por que resolve o problema ou deve ser a resposta selecionada. Além disso, devemos educar para ajudar a resolver o problema.
The Tin Man