Saltar al contenido principal

Cómo utilizar na.rm para tratar los valores perdidos en R

Establecimos na.rm = TRUE en las funciones comunes de R para excluir los valores perdidos (NA). Esto nos ayuda a calcular estadísticas precisas y aumenta la fiabilidad de nuestros resultados.
Actualizado 29 jul 2024  · 8 min de lectura

Los datos se generan y consumen a un ritmo industrial para impulsar decisiones empresariales clave. Sin embargo, un reto habitual en el análisis de datos es la presencia de valores perdidos. Esto puede sesgar los resultados, por lo que es inevitable que cualquier analista de datos los maneje con eficacia. En R, una de las herramientas fundamentales para gestionar los valores perdidos es el parámetro na.rm.

Este post explica la importancia de tratar los datos que faltan, cómo funciona na.rm en R, demuestra su uso en varias funciones y concluye con la discusión de algunas técnicas alternativas para identificar y tratar los datos que faltan.

La respuesta breve: ¿Qué es na.rm?

El parámetro na.rm en R significa "eliminar NA" e ignora los valores NA (que faltan) durante los cálculos. Fijando na.rm = TRUE, funciones como mean(), sum(), min(), max(), median(), y sd() calculan los resultados sin que les afecten los valores perdidos.

El parámetro na.rm, escrito en minúsculas, incluye un valor booleano -TRUE o FALSE. Cuando fijamos na.rm = TRUE, R excluye los valores de NA de los cálculos. Sin este parámetro, las funciones devolverían NA si hay valores perdidos en los datos. Echa un vistazo.

vector_with_na <- c(1, 2, NA)

sum(vector_with_na, na.rm = TRUE) # removes NA values — returns 3
sum(vector_with_na) # includes NA values — returns NA
sum(vector_with_na, na.rm = FALSE) # includes NA values — returns NA

Consulta el curso Introducción a R para saber más sobre programación básica en R.

¿Por qué utilizar na.rm?

Manejar los valores perdidos es crucial en el análisis de datos para garantizar resultados precisos, ya que pueden afectar significativamente a los cálculos estadísticos, llevando inadvertidamente a conclusiones incorrectas. Utilizar na.rm permite evitar errores saltándose estos valores perdidos, realizando así cálculos fiables y manteniendo la integridad de los datos.

El curso de Limpieza de Datos en R es valioso para mejorar nuestras habilidades de análisis de datos.

Funciones comunes utilizando na.rm: Algunos ejemplos prácticos

Ahora, vamos a entender cómo utilizar na.rm en R. Varias funciones de R incorporan el parámetro na.rm (fijado en FALSE por defecto). He aquí algunos ejemplos comunes:

sum()

Como su nombre indica, el sum() calcula el total de valores de un vector. Vamos a crear un vector llamado vector_with_na, que utilizaremos a lo largo de este tutorial.

vector_with_na <- c(1, 2, NA, 4)

sum(vector_with_na) 
# Returns NA

sum(vector_with_na, na.rm = TRUE) 
# Returns 7

mean()

Utilizando el mismo ejemplo, la función mean() calcula la media, es decir, la media de los valores de nuestro vector.

mean(vector_with_na) 
# Returns NA

mean(vector_with_na, na.rm = TRUE) 
# Returns 2.33

sd()

Siguiendo con vector_with_na, en sd() se calcula la desviación típica del vector.

sd(vector_with_na) 
# Returns NA

sd(vector_with_na, na.rm = TRUE) 
# Returns 1.53

min()

El min() encuentra el valor mínimo.

min(vector_with_na) 
# Returns NA

min(vector_with_na, na.rm = TRUE) 
# Returns 1

max()

max() encuentra el valor máximo.

max(vector_with_na) 
# Returns NA

max(vector_with_na, na.rm = TRUE) 
# Returns 4

median()

median() encuentra el valor medio cuando se ordenan.

median(vector_with_na) 
# Returns NA

median(vector_with_na, na.rm = TRUE) 
# Returns 2

Observa que en ausencia de na.rm = TRUE todas estas funciones agregadas devuelven NA.

Fijando na.rm = TRUE, estas funciones excluyen los valores de NA, lo que conduce a cálculos precisos y significativos. El tema de conocimientos Fundamentos de programación en R puede ser un buen recurso para comprender mejor el uso y la sintaxis de estas funciones.

Tratamiento de valores perdidos en diferentes estructuras de datos

Veamos cómo tratar los valores perdidos en diferentes estructuras de datos. Antes de continuar, echa un vistazo a nuestro Dominio de las estructuras de datos en el lenguaje de programación R si quieres saber más sobre las estructuras de datos en R. 

Vectores

En los vectores, na.rm puede utilizarse directamente dentro de las funciones para excluir los valores perdidos. Los ejemplos compartidos en la sección anterior son todos ejemplos de na.rm en acción sobre vectores.

Marcos de datos

Para los marcos de datos, na.rm puede aplicarse dentro de funciones utilizadas en columnas específicas o a través de filas utilizando apply(), como se muestra a continuación:

apply(X, MARGIN, FUN)

Toma:

  • Xuna matriz, marco de datos o matriz

  • MARGIN: argumento para identificar dónde aplicar la función:

    • MARGIN=1 para manipular filas

    • MARGIN=2 para manipular columnas

    • MARGIN=c(1,2) para manipular filas y columnas

  • FUN: indica qué función aplicar. Se pueden aplicar funciones incorporadas como mean(), median(), sum(), min(), max(), y funciones definidas por el usuario.

Vamos a crear un marco de datos para que nos sirva de referencia a lo largo de este tutorial.

dataframe_with_na <- data.frame(col1 = c(1, NA, 3, 6), col2 = c(4, 5, NA, 7))

print(dataframe_with_na)
# Returns
#   col1 col2
# 1    1    4
# 2   NA    5
# 3    3   NA
# 4    6    7

apply(dataframe_with_na, 1, mean)
# Returns
# [1] 2.5  NA  NA 6.5

apply(dataframe_with_na, 1, mean, na.rm = TRUE)
# Returns
# [1] 2.5 5.0 3.0 6.5

apply(dataframe_with_na, 2, mean)
# Returns
# col1 col2 
#  NA   NA 

apply(dataframe_with_na, 2, mean, na.rm = TRUE)
# Returns   
#   col1     col2 
# 3.333333 5.333333

Listas

La función lapply() en R se utiliza para aplicar una función especificada a cada elemento de una lista, vector o marco de datos, y devuelve una lista de la misma longitud. Esta función no requiere un parámetro MARGIN, ya que aplica automáticamente la operación a todos los elementos.

Syntax:

lapply(vector_with_na, fun)

Toma:

  • vector_with_na: La lista, vector o marco de datos de entrada.
  • fun: La función que debe aplicarse a cada elemento de datos de entrada.

Vamos a entender lapply() con un ejemplo de lista. Aquí tenemos una lista de colecciones (item_1 y item_2) con elementos similares al marco de datos (dataframe_with_na). Nuestro objetivo es encontrar la media de cada colección.

list_with_na <- list(item_1=c(1, NA, 3, 6), item_2=c(4, 5, NA, 7))

lapply(list_with_na, mean)
# Returns
# $item_1
# [1] NA
# 
# $item_2
# [1] NA

lapply(list_with_na, mean, na.rm =TRUE)
# Returns
# $item_1
# [1] 3.333333
# 
# $item_2
# [1] 5.333333

La función sapply() es similar a lapply() pero devuelve una matriz o array en lugar de una lista. Utilicemos la lista (list_with_na) y el sapply() para calcular la media de los valores de cada colección que contiene.

sapply(list_with_na, mean)
# Returns
# a  b 
# NA NA 

sapply(list_with_na, mean, na.rm = TRUE)

# Returns
# a        b 
# 3.333333 5.333333

Ahora, vamos a utilizar el marco de datos (dataframe_with_na) y el sapply() para calcular la suma de los valores de cada columna.

sapply(dataframe_with_na, sum)

# Returns
# col1 col2 
# NA   NA 

sapply(dataframe_with_na, sum, na.rm=TRUE)
# Returns
# col1 col2 
# 10   16

Para una comprensión más amplia de la manipulación de datos en R, es muy recomendable el curso Manipulación de Datos con dplyr. Si te sientes inseguro con la familia de funciones apply() en concreto, lee nuestro Tutorial sobre la familia apply de R.

Comparación con na.omit() y complete.cases()

na.omit(): Esta función elimina todas las filas que contienen valores NA en un marco de datos. Vamos a entenderlo con un ejemplo:

na.omit(dataframe_with_na)
# Returns
# col1 col2
# 1    1    4
# 4    6    7

complete.cases(): Por otra parte, complete.cases() identifica las filas sin ningún valor NA y devuelve un bool correspondiente a cada fila (FALSE para las filas con NA y viceversa). Se puede utilizar para filtrar los valores no ausentes en el marco de datos, como se muestra a continuación.

complete.cases(dataframe_with_na)
# Returns
# [1]  TRUE FALSE FALSE  TRUE

dataframe_with_na[complete.cases(dataframe_with_na), ]
# Returns
# col1 col2
# 1    1    4
# 4    6    7

Técnicas avanzadas para tratar valores perdidos

Además de na.rm, R ofrece métodos avanzados para tratar los datos que faltan:

Utilizar is.na() para identificar valores perdidos

is.na() se puede aplicar directamente sobre un vector o marco de datos para identificar los datos que faltan. Devuelve un TRUE correspondiente a cada valor perdido.

is.na(vector_with_na)
# Returns
# [1] FALSE FALSE  TRUE FALSE

is.na(dataframe_with_na)
# Returns
# col1  col2
# [1,] FALSE FALSE
# [2,]  TRUE FALSE
# [3,] FALSE  TRUE
# [4,] FALSE FALSE

Aplicación de métodos de imputación

La imputación sustituye los valores que faltan por valores estimados, como la media o la mediana, como se muestra a continuación:

vector_with_na[is.na(vector_with_na)] <- mean(vector_with_na, na.rm = TRUE)

print(vector_with_na)
# Returns
# [1] 1.000000 2.000000 2.333333 4.000000

dataframe_with_na[is.na(dataframe_with_na)] <- sapply(dataframe_with_na, mean, na.rm=TRUE)
print(dataframe_with_na)
# Returns
# col1     col2
# 1 1.000000 4.000000
# 2 3.333333 5.000000
# 3 3.000000 5.333333
# 4 6.000000 7.000000

Utilizar la función resumen()

Curiosamente, la funciónsummary() difiere del uso de na.rm para tratar los valores perdidos. Por defecto, summary() excluye automáticamente los valores que faltan al calcular las estadísticas de resumen e informa posteriormente del número de NAs presentes en los datos.

Vamos a ejecutar summary() en el vector vector_with_na:

summary(vector_with_na)
#Returns
#   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
#  1.000   1.500   2.000   2.333   3.000   4.000       1

Y en el marco de datos dataframe_with_na:

summary(dataframe_with_na)
# Returns
# col1           col2     
# Min.   :1.00   Min.   :4.00  
# 1st Qu.:2.50   1st Qu.:4.75  
# Median :3.00   Median :5.00  
# Mean   :3.25   Mean   :5.25  
# 3rd Qu.:3.75   3rd Qu.:5.50  
# Max.   :6.00   Max.   :7.00 

El curso R Intermedio ofrece una visión en profundidad para los interesados en técnicas más avanzadas de tratamiento de datos.

Buenas prácticas para tratar los valores perdidos

Manejar eficazmente los valores perdidos implica varias buenas prácticas:

Comprueba siempre si faltan valores

Identifica y comprende el alcance de los datos que faltan antes de realizar los cálculos. El siguiente ejemplo muestra que el marco de datos tiene un total de 2 valores perdidos.

print(dataframe_with_na)
# Returns
# col1 col2
# 1    1    4
# 2   NA    5
# 3    3   NA
# 4    6    7

sum(is.na(dataframe_with_na))
# Returns
# [1] 2

Utiliza comprobaciones condicionales

Comprueba siempre la presencia de datos omitidos y aplica en consecuencia cualquier técnica de imputación, asegurándote de que todos los casos extremos se tratan bien.

if(any(is.na(dataframe_with_na))) {  
  if (class(dataframe_with_na) == "data.frame") {    
   dataframe_with_na[is.na(dataframe_with_na)] <- sapply(dataframe_with_na, median, na.rm=TRUE)      
  }
}

print(dataframe_with_na)
# Returns
# col1 col2
# 1    1    4
# 2    3    5
# 3    3    5
# 4    6    7

Considera el contexto

Comprende por qué faltan datos y elige un método adecuado para tratarlos -eliminación o imputación-.

Para un enfoque estructurado del análisis de datos y el tratamiento de los valores perdidos, el programa Limpieza de datos en R puede ser un gran recurso.

Conclusión

Comprender y utilizar na.rm es clave para garantizar un análisis de datos fiable y preciso. Practica el uso de na.rm en proyectos de R y explora técnicas avanzadas para tratar los datos omitidos de forma exhaustiva.

Para seguir aprendiendo, explora estos recursos adicionales:

Preguntas frecuentes

¿Qué es el parámetro na.rm en R?

El parámetro na.rm en R significa "eliminar NA". Cuando se establece en TRUE, indica a las funciones que ignoren los valores NA (que faltan) durante los cálculos, garantizando resultados precisos.

¿Cómo se utiliza na.rm en las funciones habituales de R?

Puedes utilizar na.rm en funciones como sum(), mean(), sd(), min(), max(), y median() configurando na.rm = TRUE para excluir los valores perdidos de los cálculos.

¿Por qué es importante tratar los valores perdidos en el análisis de datos?

Los valores perdidos pueden sesgar los resultados y llevar a conclusiones inexactas. Manejarlos eficazmente garantiza la fiabilidad de los cálculos y mantiene la integridad de los datos.

¿Se puede utilizar na.rm con marcos de datos y listas en R?

Sí, na.rm se puede utilizar con marcos de datos mediante funciones como apply(), y con listas mediante lapply() y sapply(), para excluir los valores perdidos durante las operaciones sobre estas estructuras de datos.

¿Cuáles son algunas técnicas avanzadas para tratar los valores perdidos en R?

Además de na.rm, las técnicas avanzadas incluyen el uso de is.na() para identificar valores perdidos, aplicar métodos de imputación para sustituirlos y aprovechar funciones como na.omit() y complete.cases() para una limpieza de datos más compleja.

Temas

Aprende R con DataCamp

Certificación disponible

curso

Introducción a R

4 hr
2.7M
Domina los fundamentos del análisis de datos en R, incluyendo vectores, listas y marcos de datos, y practica R con conjuntos de datos reales.
Ver detallesRight Arrow
Comienza el curso
Ver másRight Arrow
Relacionado

tutorial

Tutorial de tablas de contingencia en R

En este tutorial, aprenderás a crear tablas de contingencia y a probar y cuantificar las relaciones visibles en ellas.
Łukasz Deryło's photo

Łukasz Deryło

10 min

tutorial

Las mejores técnicas para gestionar valores perdidos que todo científico de datos debe conocer

Explore varias técnicas para manejar eficazmente los valores perdidos y sus implementaciones en Python.
Zoumana Keita 's photo

Zoumana Keita

15 min

tutorial

Tutorial de pruebas T en R: Aprende a realizar pruebas T

Determina si existe una diferencia significativa entre las medias de los dos grupos utilizando t.test() en R.
Abid Ali Awan's photo

Abid Ali Awan

10 min

tutorial

K-Nearest Neighbors (KNN) Clasificación con R Tutorial

Aprenda a utilizar los paquetes 'class' y 'caret' de R, a ajustar los hiperparámetros y a evaluar el rendimiento del modelo.
Abid Ali Awan's photo

Abid Ali Awan

11 min

tutorial

Guía de expresiones regulares en R

Explore las expresiones regulares en R, por qué son importantes, las herramientas y funciones para trabajar con ellas, patrones regex comunes y cómo utilizarlos.
Elena Kosourova's photo

Elena Kosourova

16 min

tutorial

Tutorial de análisis de componentes principales en R

En este tutorial, aprenderás a utilizar el PCA (análisis de componentes principales) de R para extraer datos con muchas variables y crear visualizaciones para mostrar esos datos.
Zoumana Keita 's photo

Zoumana Keita

15 min

Ver másVer más