0Pricing
R Academy · Lección

NA en cálculos y agregaciones

Controle el comportamiento de NA en mean(), sum() y otras funciones de agregación.

NA en cálculos y agregaciones es una lección gratuita de R Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de R Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de R Academy incluye 4 lecciones en total.

El parámetro na.rm

La mayoría de las funciones de agregación de R aceptan un argumento na.rm (eliminar NA). Cuando se establece en TRUE, la función ignora los valores NA antes de calcular el resultado. De forma predeterminada, na.rm = FALSE, por lo que los NA se propagan.

scores <- c(88, NA, 72, 95, NA, 81, 67)
cat('With na.rm=FALSE (default):
')
cat('  mean:', mean(scores), '
')           # NA
cat('  sum: ', sum(scores), '
')            # NA
cat('With na.rm=TRUE:
')
cat('  mean:', mean(scores, na.rm = TRUE), '
')  # 80.6
cat('  sum: ', sum(scores, na.rm = TRUE), '
')   # 403

mean() con na.rm

mean(x, na.rm = TRUE) calcula la media aritmética de los valores no ausentes. El denominador es el número de valores presentes, no la longitud total.

temperatures <- c(22.1, NA, 19.8, 25.1, NA, 17.3, 20.0)

cat('Total elements:', length(temperatures), '
')
cat('Present elements:', sum(!is.na(temperatures)), '
')
cat('Mean (na.rm=TRUE):', mean(temperatures, na.rm = TRUE), '
')

# Manual verification
cat('Manual mean:', sum(temperatures, na.rm=TRUE) / sum(!is.na(temperatures)), '
')

sum() con na.rm

sum(x, na.rm = TRUE) suma únicamente los valores que no son NA. Esto es esencial para contar los valores TRUE de un vector lógico que puede contener NA o calcular totales a partir de datos incompletos.

sales_daily <- c(1200, NA, 980, 1450, NA, 1100, 890)
cat('Sum (default):', sum(sales_daily), '
')            # NA
cat('Sum (na.rm):  ', sum(sales_daily, na.rm = TRUE), '
')  # 5620

# Count observations meeting a condition (NA-safe)
cat('Days over 1000:', sum(sales_daily > 1000, na.rm = TRUE), '
')

min() y max() con na.rm

min() y max() también tienen el parámetro na.rm. Sin él, un solo NA en la entrada hace que la función devuelva NA. Con na.rm = TRUE, se devuelven los extremos de los valores presentes.

blood_pressure <- c(120, NA, 135, 118, NA, 142, 125, NA, 130)
cat('Max BP (default):', max(blood_pressure), '
')              # NA
cat('Max BP (na.rm):  ', max(blood_pressure, na.rm = TRUE), '
')  # 142
cat('Min BP (na.rm):  ', min(blood_pressure, na.rm = TRUE), '
')  # 118
cat('Range (na.rm):   ', range(blood_pressure, na.rm = TRUE), '
')

var() y sd() con na.rm

La varianza (var()) y la desviación estándar (sd()) también admiten na.rm. Calculan el estadístico usando únicamente las observaciones no ausentes y ajustan automáticamente los grados de libertad.

exam_scores <- c(78, 85, NA, 92, 68, 75, NA, 88, 91, NA)
n_valid <- sum(!is.na(exam_scores))
cat('Valid observations:', n_valid, '
')
cat('Mean:   ', round(mean(exam_scores, na.rm = TRUE), 2), '
')
cat('SD:     ', round(sd(exam_scores, na.rm = TRUE), 2), '
')
cat('Var:    ', round(var(exam_scores, na.rm = TRUE), 2), '
')

median() y quantile() con na.rm

median() y quantile() suelen ser más robustas frente a valores atípicos que la media, pero también necesitan na.rm = TRUE para tratar correctamente los valores ausentes.

incomes <- c(45000, NA, 52000, 48000, NA, 210000, 51000, NA, 49000)
cat('Observations:', sum(!is.na(incomes)), '
')
cat('Median income:', median(incomes, na.rm = TRUE), '
')
cat('Mean income:  ', mean(incomes, na.rm = TRUE), '
')  # pulled up by 210000
cat('25th pctile:  ', quantile(incomes, 0.25, na.rm = TRUE), '
')
cat('75th pctile:  ', quantile(incomes, 0.75, na.rm = TRUE), '
')

prod() y cumsum() con na.rm

prod(x, na.rm = TRUE) calcula el producto de los valores que no son NA. Las funciones acumulativas como cumsum() NO tienen na.rm: los NA se propagan desde el primer valor ausente en adelante.

growth_rates <- c(1.05, NA, 1.03, 1.08, NA, 1.02)
cat('Product of rates:', prod(growth_rates, na.rm = TRUE), '
')

# cumsum propagates NAs
values <- c(10, 20, NA, 40, 50)
cat('cumsum (with NA):', cumsum(values), '
')

# Workaround: replace NA first
filled <- replace(values, is.na(values), 0)
cat('cumsum (NA=0):   ', cumsum(filled), '
')

na.rm en funciones apply

Al usar apply() sobre las filas o columnas de una matriz, puede pasar na.rm = TRUE a la función mediante .... Así se calculan agregados ignorando los NA.

m <- matrix(c(88,NA,72, 95,81,NA, 67,75,90), nrow = 3)
cat('Matrix:
'); print(m)

# Row means ignoring NAs
cat('Row means (na.rm=TRUE):', apply(m, 1, mean, na.rm = TRUE), '
')

# Col means ignoring NAs
cat('Col means (na.rm=TRUE):', apply(m, 2, mean, na.rm = TRUE), '
')

rowSums() / colSums() con na.rm

rowSums() y colSums() tienen su propio parámetro na.rm (no se pasa mediante ...). Usar na.rm = TRUE hace que traten los NA como 0 en las sumas.

sales <- matrix(c(100,NA,80, NA,90,70, 110,85,NA), nrow = 3)
cat('Sales matrix:
'); print(sales)

cat('Row sums (na.rm=F):', rowSums(sales), '
')             # NAs propagate
cat('Row sums (na.rm=T):', rowSums(sales, na.rm = TRUE), '
')
cat('Col means (na.rm=T):', colMeans(sales, na.rm = TRUE), '
')

Comparación: na.rm=FALSE frente a TRUE

Entender cuándo usar na.rm = TRUE frente a FALSE depende del objetivo de su análisis: FALSE garantiza que sepa que los datos están incompletos; TRUE calcula estadísticas de la mejor estimación posible a partir de los datos disponibles.

# Always check: how much data is missing BEFORE using na.rm=TRUE
collected <- c(78, NA, 85, NA, 91, 74, NA, 88, 82, NA)
pct_missing <- mean(is.na(collected)) * 100
cat('Missing:', round(pct_missing, 1), '% of data
')

if (pct_missing < 20) {
  cat('Acceptable: computing mean with na.rm=TRUE
')
  cat('Mean:', round(mean(collected, na.rm = TRUE), 2), '
')
} else {
  cat('Too much missing data — investigate before computing
')
}

na.rm en funciones definidas por el usuario

Al escribir sus propias funciones de agregación, incluya un parámetro na.rm y páselo a las funciones base de R. Esto hace que sus funciones sean coherentes con las convenciones de R.

# Custom function with na.rm support
cv <- function(x, na.rm = FALSE) {
  # Coefficient of Variation = SD / mean
  s <- sd(x, na.rm = na.rm)
  m <- mean(x, na.rm = na.rm)
  return(s / m)
}

readings <- c(22.1, NA, 19.8, 25.1, NA, 17.3, 20.0)
cat('CV (na.rm=FALSE):', cv(readings), '
')          # NA
cat('CV (na.rm=TRUE): ', round(cv(readings, na.rm = TRUE), 4), '
')

Comprobación rápida

¿Qué devuelve mean(c(10, 20, NA, 40), na.rm = TRUE)?

Recapitulación: NA en los cálculos

¡Excelente! Estas son las ideas clave de la lección:

  • La mayoría de las funciones de agregación (mean, sum, min, max, sd, etc.) tienen un parámetro na.rm
  • na.rm = FALSE (valor predeterminado) significa que NA se propaga: si algún valor es NA, el resultado es NA
  • na.rm = TRUE ignora los valores NA y calcula la estadística únicamente a partir de los valores presentes
  • El denominador de mean(na.rm=TRUE) es la cantidad de valores que no son NA, no la longitud total
  • Compruebe siempre la proporción de datos faltantes antes de calcular estadísticas con na.rm=TRUE
  • Incluya na.rm en sus propias funciones de agregación para seguir la convención de R
# Complete summary with na.rm
data_vec <- c(55, NA, 72, 88, NA, 61, 79, NA, 93, 68)
cat('N valid:', sum(!is.na(data_vec)), '
')
cat('Mean:  ', round(mean(data_vec, na.rm=TRUE), 2), '
')
cat('Median:', median(data_vec, na.rm=TRUE), '
')
cat('SD:    ', round(sd(data_vec, na.rm=TRUE), 2), '
')
cat('Min:   ', min(data_vec, na.rm=TRUE), '
')
cat('Max:   ', max(data_vec, na.rm=TRUE), '
')

Preguntas frecuentes

¿La lección «NA en cálculos y agregaciones» es gratis?

Sí — el texto completo de «NA en cálculos y agregaciones» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de R Academy, actualiza a CoddyKit PRO. El curso de R Academy incluye 4 lecciones en total.

¿Qué aprenderé en «NA en cálculos y agregaciones»?

Controle el comportamiento de NA en mean(), sum() y otras funciones de agregación. Practicas R Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar R Academy?

No se requiere experiencia previa. R Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «NA en cálculos y agregaciones»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de R Academy?

Sí. Cada lección de R Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Comprender NA en R
  2. Detección y recuento de valores ausentes
  3. Eliminación y sustitución de valores NA
  4. NA en cálculos y agregaciones
← Volver a R Academy