La función subset() en R: filtrar filas y columnas sin librerías

subset() se queda con las filas que cumplen una condición y, si quieres, también con las columnas que le indiques. Viene en R base → no hay que instalar nada.

Ejemplo simple

subset(iris, Species == "setosa")

Los nombres de columna van tal cual, sin comillas ni $. Y el doble igual == es comparación; con uno solo estarías asignando.

Varias condiciones se unen con & (y) o | (o):

subset(iris, Species == "setosa" & Sepal.Length > 5)

subset(iris, Species == "setosa" | Species == "virginica")

Cuando son muchos valores, %in% queda más limpio:

subset(iris, Species %in% c("setosa", "virginica"))

Filtrar y elegir columnas a la vez

Esta es su ventaja frente a otras opciones: el argumento select.

subset(iris,
       Sepal.Length > 6,
       select = c(Sepal.Length, Species))

En una sola llamada haces lo que en dplyr necesitaría filter() más select().

También puedes quitar columnas con el signo menos:

subset(iris, Sepal.Length > 6, select = -Species)

Ejemplo algo más completo

Un uso típico: quedarte con las filas completas antes de analizar.

datos <- data.frame(
  cliente = c("A", "B", "C", "D"),
  importe = c(120, NA, 340, 90),
  zona = c("norte", "sur", "norte", "este")
)

limpio <- subset(datos, !is.na(importe))

nrow(datos)
nrow(limpio)

Ese !is.na(importe) se lee como "que el importe no sea ausente". La admiración niega la condición.

Y combinando filtro y selección para preparar una tabla de salida:

norte <- subset(datos,
                zona == "norte" & !is.na(importe),
                select = c(cliente, importe))

Un aviso sobre subset(): dentro de funciones propias puede dar problemas, porque evalúa los nombres de columna de forma especial. Para código dentro de funciones, es más seguro usar corchetes: datos[datos$zona == "norte", ].