HOWTO · R
Eliminar filas con NA en una columna en R
Este tutorial demuestra cómo eliminar filas con NA en una columna de un marco de datos en R.
En esta página
Para eliminar las filas en las que una columna elegida contiene NA, conserva las filas para las que is.na() devuelve FALSE. En un marco de datos df con una columna llamada score, usa la expresión de R base df[!is.na(df$score), ]. Aquí, NA es el marcador de valores ausentes de R, no el texto literal "NA". Como la condición solo comprueba score, los valores ausentes de otras columnas no afectan a las filas que se conservan.
Eliminar filas con NA en una columna usando is.na() en R
is.na() devuelve un valor lógico para cada elemento y marca los valores ausentes como TRUE. Al negar ese resultado y usarlo como índice de filas, se seleccionan los elementos no ausentes. El ejemplo asigna el resultado a kept, por lo que el df original sigue disponible. Imprime el número de filas conservadas, sus identificadores y sus puntuaciones.
df <- data.frame(id = c(1, 2, 3), score = c(10, NA, 30))
kept <- df[!is.na(df$score), ]
cat("Rows retained:", nrow(kept), "\n")
cat("IDs:", paste(kept$id, collapse = ", "), "\n")
cat("Scores:", paste(kept$score, collapse = ", "), "\n")
Sustituye score por el nombre de tu columna; el patrón general es df[!is.na(df$column), ]. La expresión devuelve un marco de datos filtrado y, si asignas el resultado a kept, df conserva su forma original. La clave está en el índice de filas: aplica la prueba lógica a la columna elegida y conserva las filas correspondientes de todo el marco de datos.
Eliminar filas con NA en una columna usando complete.cases() en R
complete.cases() devuelve un valor lógico para cada fila e indica si las entradas proporcionadas están completas. Si pasas una sola columna, la comprobación se limita a ella: df[complete.cases(df$score), ]. En cambio, pasar el marco de datos completo comprueba todas las columnas y puede eliminar filas debido a valores ausentes fuera de score. Usa la forma de una sola columna cuando no quieras que las demás columnas afecten a la selección; conserva las mismas filas que el patrón con is.na(). Esta función forma parte de R base, así que no requiere instalar otro paquete.
Eliminar filas con NA en una columna usando drop_na() en R
La función drop_na() pertenece al paquete tidyr. Usa tidyr::drop_na(df, score) para conservar las filas en las que score tiene un valor; al indicar la columna, limitas la comprobación a ella. Si no tienes instalado tidyr, instálalo con install.packages("tidyr"). La llamada devuelve un marco de datos filtrado; asígnalo a un nombre si quieres conservar y reutilizar el resultado. Si omites el argumento de columna, drop_na(df) comprueba todas las columnas. Por tanto, indica la columna objetivo cuando no quieras que las demás determinen qué filas se conservan.
Eliminar filas con NA en una columna usando na.omit() en R
Al aplicarla a un marco de datos completo, na.omit(df) elimina una fila si alguna de sus columnas contiene NA. Ese comportamiento es más amplio que filtrar solo por la columna objetivo. Incluso si aplicas na.omit() después de seleccionar filas con !is.na(df$score), todavía puede eliminar filas porque falte un valor en otra columna. Para esta tarea, usa directamente df[!is.na(df$score), ]: así las filas se seleccionan únicamente según score. na.omit() resulta útil cuando quieres eliminar las filas que tengan valores ausentes en cualquier parte del marco de datos.
Eliminar filas con NA en una columna usando subset() en R
subset() es una alternativa legible de R base: subset(df, !is.na(score)). Evalúa la condición usando las columnas del marco de datos, por lo que score se refiere a la columna de df; las demás columnas no forman parte de la condición. El marco de datos devuelto contiene las filas que la cumplen. Asigna el resultado, por ejemplo con kept <- subset(df, !is.na(score)), para reutilizarlo y conservar el df original. Al igual que en la expresión entre corchetes, el nombre de columna de la condición determina qué filas se seleccionan.
Eliminar filas con NA en una columna usando filter() en R
La función filter() del paquete dplyr selecciona filas según una condición. Llámala como dplyr::filter(df, !is.na(score)) para aplicar la condición a score; si el paquete no está disponible, instálalo con install.packages("dplyr"). La llamada devuelve un marco de datos y no sobrescribe df; asigna el resultado si quieres usar los datos filtrados más adelante. Como la condición solo menciona score, los valores ausentes de otras columnas no determinan qué filas conserva esta llamada.
Conclusión
Para una columna elegida, df[!is.na(df$column), ] es una solución directa de R base, mientras que complete.cases(df$column) proporciona una máscara similar también en R base. Elige tidyr::drop_na() o dplyr::filter() si esos paquetes ya forman parte de tu flujo de trabajo. Ten cuidado con na.omit(df): aplicado al marco de datos completo, puede descartar filas por valores NA en columnas distintas de la que querías comprobar. Usa una condición sobre una sola columna siempre que solo esa columna deba determinar qué filas se conservan.