Curso
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=1para manipular filas -
MARGIN=2para manipular columnas -
MARGIN=c(1,2)para manipular filas y columnas
-
-
FUN: indica qué función aplicar. Se pueden aplicar funciones incorporadas comomean(),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:
: La lista, vector o marco de datos de entrada.vector_with_nafun: 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:
- Limpieza de datos: Mejora tus habilidades de análisis de datos con nuestro curso de Limpieza de Datos en R.
- Introducción a R: Iníciate en la programación en R con nuestro curso Introducción a R.
- Visualización de datos: Domina la creación de visuales convincentes con nuestro curso Introducción a la Visualización de Datos con ggplot2.
- Manipulación de datos: Mejora tus técnicas de transformación de datos con nuestro curso Manipulación de Datos con dplyr.
- Análisis de regresión: Sumérgete en las técnicas de regresión y aprende estadística con nuestro curso Introducción a la regresión en R.
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.