Reemplazar NA con cero en R

Gustavo du Mortier 30 enero 2023
  1. Reemplazar NA con cero en DataFrames R más grandes
  2. Reemplazar NA con cero en un subconjunto del DataFrame de R
Reemplazar NA con cero en R

Existe una forma sencilla de sustituir NA por ceros en un DataFrame en R. Supongamos que tenemos un DataFrame llamado my_data. Para sustituir todos los valores NA por ceros en ese DataFrame, puede ejecutar esta sentencia.

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

Por ejemplo, si my_data tiene el siguiente contenido.

   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

Al ejecutar my_data[is.na(my_data)] <- 0 el contenido del DataFrame cambia a esto.

   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

Reemplazar NA con cero en DataFrames R más grandes

La solución anterior utiliza las reasignaciones de subconjuntos de R de base, que funcionan bien cuando se tienen DataFrames relativamente pequeños. Pero para conjuntos de datos más grandes, es posible que necesite una alternativa más rápida, como el nuevo enfoque de evaluación híbrido implementado en las versiones recientes del paquete dplyr.

El nuevo enfoque empleado por el paquete dplyr reconoce expresiones completas y utiliza código C++ para evaluarlas. De este modo, se pueden conseguir transformaciones hasta un 30% más rápidas al procesar DataFrames grandes.

Para sustituir los valores NA por ceros utilizando el paquete dplyr, puede utilizar la función mutate con el verbo de alcance _all y la función replace en el formato purrr, como en el siguiente ejemplo.

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

El uso de la notación purrr nos permite aplicar la función replace a cada elemento del DataFrame.

Reemplazar NA con cero en un subconjunto del DataFrame de R

En lugar del verbo de ámbito _all en la función mutate, puede utilizar el verbo de ámbito _at para restringir la acción de sustitución a columnas específicas. Para ello, puedes incluir un vector con los nombres de las columnas donde quieres que se aplique el reemplazo. Utilizando el DataFrame anterior, si necesita reemplazar valores NA sólo en las columnas C1 y C4, puede utilizar el siguiente comando:

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

De esta manera, sólo los NAs en las columnas C1 y C4 son reemplazados por 0, resultando en un DataFrame como el siguiente.

   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

En el ejemplo anterior, es posible que haya querido sustituir NA por ceros sólo en las columnas numéricas para evitar incluir valores cero en las columnas alfanuméricas como C3. En ese caso, en lugar de especificar las columnas en las que desea aplicar el reemplazo, puede utilizar la función mutate_if con la condición is.numeric para indicar a R que sustituya NA por ceros sólo en las columnas numéricas. En el siguiente ejemplo, puedes encontrar el código completo para probar esto, desde la instalación del paquete dplyr y el llenado del DataFrame hasta la realización de los reemplazos y la visualización de los 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

Puede encontrar más información sobre la función mutate() y sus variantes en la Documentación de R.

Artículo relacionado - R Data Frame