Reemplazar NA con cero en R
- Reemplazar NA con cero en DataFrames R más grandes
- Reemplazar NA con cero en un subconjunto del DataFrame de 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.