0Pricing
R Academy · Lección

Eliminación y sustitución de valores NA

Aplique na.omit(), complete.cases() y estrategias de sustitución manual.

Eliminación y sustitución de valores NA es una lección gratuita de R Academy en CoddyKit. Esta es la lección 3 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.

Estrategias para tratar NA

Hay tres estrategias principales para tratar los valores ausentes: eliminarlos, reemplazarlos por una constante o imputarlos mediante una estimación estadística. El enfoque adecuado depende de los datos y de los objetivos del análisis.

data_vals <- c(88, NA, 72, NA, 91, 65, NA, 78)
cat('Original data:', data_vals, '
')
cat('NA count:', sum(is.na(data_vals)), '
')

# Strategy 1: remove
cat('After removal:', data_vals[!is.na(data_vals)], '
')
# Strategy 2: replace with 0
replaced <- data_vals; replaced[is.na(replaced)] <- 0
cat('Replaced with 0:', replaced, '
')

Eliminar NA con x[!is.na(x)]

La forma más directa de eliminar los NA de un vector es mediante la selección lógica: x[!is.na(x)]. Esto conserva únicamente los elementos para los que is.na(x) es FALSE (es decir, los valores presentes).

response_times <- c(1.2, NA, 0.9, 1.5, NA, 1.1, 0.8, NA, 1.3)
cat('With NAs:    ', response_times, '
')
cat('Length:', length(response_times), '
')

clean_times <- response_times[!is.na(response_times)]
cat('Without NAs: ', clean_times, '
')
cat('Length:', length(clean_times), '
')
cat('Mean after removal:', round(mean(clean_times), 3), '
')

na.omit() para vectores

na.omit(x) elimina los valores NA de un vector. Equivale a x[!is.na(x)], pero también guarda las posiciones de los NA eliminados en un atributo llamado 'na.action'.

scores <- c(88, NA, 72, NA, 91, 65, NA, 78)
clean_scores <- na.omit(scores)
cat('Original:', scores, '
')
cat('Cleaned: ', as.numeric(clean_scores), '
')

# na.omit records which positions were removed
removed_at <- attr(clean_scores, 'na.action')
cat('NAs were at positions:', removed_at, '
')

na.omit() para data frames

Cuando se aplica a un data frame, na.omit(df) elimina cualquier fila que contenga al menos un NA. Esto se denomina eliminación por lista: se descarta la observación completa.

df <- data.frame(
  name   = c('Alice', 'Bob', 'Carol', 'Dave', 'Eve'),
  age    = c(28, NA, 32, 45, 29),
  salary = c(55000, 72000, NA, 90000, 61000)
)
cat('Original rows:', nrow(df), '
')
df_clean <- na.omit(df)
cat('After na.omit rows:', nrow(df_clean), '
')
print(df_clean)

complete.cases(): integridad por filas

complete.cases(df) devuelve un vector lógico con TRUE para las filas que no tienen valores ausentes. Úselo para filtrar las filas completas o identificar cuáles están incompletas.

df <- data.frame(
  id  = 1:5,
  x   = c(1, NA, 3, 4, NA),
  y   = c(NA, 2, 3, NA, 5)
)
cc <- complete.cases(df)
cat('Complete cases (T/F):', cc, '
')
cat('Complete rows:
')
print(df[cc, ])
cat('Number complete:', sum(cc), '
')

Reemplazar NA por una constante

Para reemplazar NA por un valor específico, use una asignación lógica: x[is.na(x)] <- value. Entre los reemplazos habituales se incluyen 0 para recuentos, la media o mediana para datos continuos, o una etiqueta de categoría para factores.

# Replace with 0
counts <- c(5, NA, 3, NA, 8, 1, NA, 4)
counts_filled <- counts
counts_filled[is.na(counts_filled)] <- 0
cat('Original:', counts, '
')
cat('Filled:  ', counts_filled, '
')

# Replace with mean of present values
mean_val <- mean(counts, na.rm = TRUE)
counts_mean <- counts
counts_mean[is.na(counts_mean)] <- mean_val
cat('Mean-filled:', round(counts_mean, 1), '
')

replace(): reemplazo funcional

replace(x, list, values) devuelve una copia modificada de x en la que los elementos de las posiciones list se reemplazan por values. Es el enfoque funcional (sin modificar el original) para realizar reemplazos.

temps <- c(22.1, NA, 19.8, NA, 25.1)
cat('Original:', temps, '
')

# Replace NAs with the median
median_temp <- median(temps, na.rm = TRUE)
filled_temps <- replace(temps, is.na(temps), median_temp)
cat('Filled:  ', filled_temps, '
')
cat('Original unchanged:', temps, '
')  # original not modified

Relleno hacia delante (última observación arrastrada)

Una estrategia de imputación habitual es el relleno hacia delante (LOCF): reemplazar cada NA por el último valor conocido. Se usa con datos de series temporales en los que las mediciones se mantienen hasta que se actualizan.

# Manual forward-fill
readings <- c(10, NA, NA, 13, NA, 15, NA, NA, 18)
filled <- readings
for (i in seq_along(filled)) {
  if (is.na(filled[i]) && i > 1) {
    filled[i] <- filled[i - 1]
  }
}
cat('Original:     ', readings, '
')
cat('Forward-filled:', filled, '
')

Reemplazar NA en vectores de caracteres

Las mismas técnicas funcionan con vectores de caracteres. En el análisis de datos categóricos, es habitual reemplazar los NA de las cadenas por una etiqueta como 'Unknown' o 'Missing'.

categories <- c('A', NA, 'B', 'A', NA, 'C', NA, 'B')
cat('Original:', categories, '
')

# Replace with 'Unknown'
filled_cat <- replace(categories, is.na(categories), 'Unknown')
cat('Filled:  ', filled_cat, '
')

# Count each category
cat('Table:
')
print(table(filled_cat))

Estrategia de reemplazo condicional

A veces es necesario usar distintos valores de reemplazo según el valor de otra columna. Use la indexación con condiciones para aplicar reemplazos selectivos.

# Scores: replace NA with group mean
group   <- c('A', 'A', 'B', 'B', 'A', 'B')
scores  <- c(85, NA, 72, NA, 90, 78)

mean_a <- mean(scores[group == 'A'], na.rm = TRUE)
mean_b <- mean(scores[group == 'B'], na.rm = TRUE)

imputed <- scores
imputed[is.na(imputed) & group == 'A'] <- mean_a
imputed[is.na(imputed) & group == 'B'] <- mean_b

cat('Original:', scores, '
')
cat('Imputed: ', imputed, '
')

Resumen de métodos para eliminar NA

Resumen de las herramientas para tratar NA en R:

  • x[!is.na(x)] — elimina los NA de un vector
  • na.omit(x) — elimina los NA (también registra sus posiciones)
  • na.omit(df) — elimina las filas incompletas de un data frame
  • complete.cases(df) — vector lógico: TRUE para las filas completas
  • x[is.na(x)] <- val — reemplaza los NA en el propio vector
  • replace(x, is.na(x), val) — reemplazo funcional (devuelve una copia)
v <- c(5, NA, 8, NA, 3, 7)
cat('Remove:          ', v[!is.na(v)], '
')
cat('Replace with 0:  ', replace(v, is.na(v), 0), '
')
cat('Replace with mean:', replace(v, is.na(v), mean(v, na.rm=TRUE)), '
')

Comprobación rápida

¿Qué devuelve na.omit(c(1, NA, 3, NA, 5))?

Resumen: eliminar y reemplazar NA

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

  • x[!is.na(x)] y na.omit(x) eliminan los NA de un vector
  • na.omit(df) realiza una eliminación por lista (elimina cualquier fila con un NA)
  • complete.cases(df) identifica las filas sin valores ausentes
  • x[is.na(x)] <- value reemplaza los NA en el propio vector
  • replace(x, is.na(x), value) devuelve una copia modificada sin cambiar el original
  • Elija la estrategia según el motivo por el que faltan datos y la cantidad de datos ausentes
# Complete workflow: audit, then handle
data_raw <- c(82, NA, 75, NA, 91, 68, NA, 79)
cat('Missing:', sum(is.na(data_raw)), '/', length(data_raw), '
')

# Replace with median (robust to outliers)
imputed <- replace(data_raw, is.na(data_raw), median(data_raw, na.rm=TRUE))
cat('Before imputation mean:', round(mean(data_raw, na.rm=TRUE), 2), '
')
cat('After imputation mean: ', round(mean(imputed), 2), '
')

Preguntas frecuentes

¿La lección «Eliminación y sustitución de valores NA» es gratis?

Sí — el texto completo de «Eliminación y sustitución de valores NA» 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 «Eliminación y sustitución de valores NA»?

Aplique na.omit(), complete.cases() y estrategias de sustitución manual. 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 3 de 4.

¿Cuánto tiempo toma la lección «Eliminación y sustitución de valores NA»?

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