Substitua NA por zero em R

Gustavo du Mortier 26 abril 2021
  1. Substitua NA por zero em frames de dados R maiores
  2. Substitua NA por zero em um subconjunto do quadro de dados R
Substitua NA por zero em R

Há uma maneira simples de substituir NA por zeros em um quadro de dados em R. Suponha que você tenha um quadro de dados chamado meus_dados. Para substituir todos os valores NA por zeros nesse quadro de dados, você pode executar esta instrução.

my_data[is.na(my_data)] <- 0

Por exemplo, se my_data tiver o conteúdo abaixo.

   C1  C2    C3  C4  C5
1   4   3  <NA>   3   7
2   9   8   ABC   5  10
3   1   1   XYZ   3   6
4  NA   4  <NA>   7  10
5   1   2   ZC1  NA   2

Quando você executa my_data[is.na(my_data)] <- 0, o conteúdo do quadro de dados muda para este.

   C1  C2    C3  C4  C5
1   4   3     0   3   7
2   9   8   ABC   5  10
3   1   1   XYZ   3   6
4   0   4     0   7  10
5   1   2   ZC1   0   2

Substitua NA por zero em frames de dados R maiores

A solução anterior usa as reatribuições do subconjunto Base R, que funcionam bem quando você tem quadros de dados relativamente pequenos. Mas para conjuntos de dados maiores, você pode precisar de uma alternativa mais rápida, como a nova abordagem de avaliação híbrida implementada em versões recentes do pacote dplyr.

A nova abordagem empregada pelo pacote dplyr reconhece expressões inteiras e usa código C++ para avaliá-las. Dessa forma, você pode obter transformações até 30% mais rápidas ao processar frames de big data.

Para substituir valores NA por zeros usando o pacote dplyr, você pode usar a função mutate com o verbo com escopo _all e a função replace no formato purrr, como no exemplo abaixo.

my_data <- mutate_all(my_data, ~replace(., is.na(.), 0))

O uso da notação purrr nos permite aplicar a função replace a cada elemento do quadro de dados.

Substitua NA por zero em um subconjunto do quadro de dados R

Em vez do verbo com escopo _all na função mutate, você pode usar o verbo com escopo _at para restringir a ação de substituição a colunas específicas. Para fazer isso, você pode incluir um vetor com os nomes das colunas onde deseja que a substituição seja aplicada. Usando o quadro de dados anterior, se você precisar substituir os valores NA apenas nas colunas C1 e C4, você pode usar o seguinte comando:

my_data <- mutate_at(my_data, c("C1", "C4"), ~replace(., is.na(.), 0))

Desta forma, apenas os NAs nas colunas C1 e C4 são substituídos por 0, resultando em um quadro de dados como abaixo.

   C1  C2    C3  C4  C5
1   4   3  <NA>   3   7
2   9   8   ABC   5  10
3   1   1   XYZ   3   6
4   0   4  <NA>   7  10
5   1   2   ZC1   0   2

No exemplo anterior, você pode querer substituir NA por zeros apenas em colunas numéricas para evitar a inclusão de valores zero em colunas alfanuméricas, como C3. Se for esse o caso, em vez de especificar as colunas onde deseja aplicar a substituição, você pode usar a função mutate_if com a condição is.numeric para dizer a R para substituir NA por zeros apenas em colunas numéricas. No exemplo a seguir, você pode encontrar o código completo para fazer isso, desde a instalação do pacote dplyr e preenchendo o quadro de dados para realizar as substituições e exibir os resultados.

install.packages("dplyr")
library(dplyr)
C1 <- c(4, 9, 1, NA, 1)
C2 <- c(3, 8, 1, 4, 2)
C3 <- c(NA, 'ABC', 'XYZ', NA, 'ZC1')
C4 <- c(3, 5, 3, 7, NA)
C5 <- c(7, 10, NA, 10, 2)
my_data <- data.frame(C1, C2, C3, C4, C5)
my_data <- mutate_if(my_data, is.numeric, ~replace(., is.na(.), 0))
my_data

Resultado:

   C1  C2    C3  C4  C5
1   4   3  <NA>   3   7
2   9   8   ABC   5  10
3   1   1   XYZ   3   0
4   0   4  <NA>   7  10
5   1   2   ZC1   0   2

Você pode encontrar mais informações sobre a função mutate() e suas variantes na Documentação R.

Artigo relacionado - R Data Frame