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", ].