Subconjunto/filtrar filas en un marco de datos según una condición en una columna
Dado un marco de datos "foo", ¿cómo puedo seleccionar solo esas filas de "foo" donde, por ejemplo foo$location = "there"
?
foo = data.frame(location = c("here", "there", "here", "there", "where"), x = 1:5, y = 6:10)
foo
# location x y
# 1 here 1 6
# 2 there 2 7
# 3 here 3 8
# 4 there 4 9
# 5 where 5 10
Resultado deseado, "barra":
# location x y
# 2 there 2 7
# 4 there 4 9
Aquí están los dos enfoques principales. Prefiero este por su legibilidad:
bar <- subset(foo, location == "there")
Tenga en cuenta que puede encadenar muchos condicionales con &
y |
para crear subconjuntos complejos.
El segundo es el enfoque de indexación. Puede indexar filas en R con sectores numéricos o booleanos. foo$location == "there"
devuelve un vector de T
y F
valores que tiene la misma longitud que las filas de foo
. Puede hacer esto para devolver solo filas donde la condición devuelve verdadero.
foo[foo$location == "there", ]
Solo para ampliar la respuesta anterior, también puede indexar sus columnas en lugar de especificar los nombres de las columnas, lo que también puede ser útil dependiendo de lo que esté haciendo. Dado que su ubicación es el primer campo, se vería así:
bar <- foo[foo[ ,1] == "there", ]
Esto es útil porque puede realizar operaciones en el valor de su columna, como recorrer columnas específicas (y también puede hacer lo mismo indexando números de fila).
Esto también es útil si necesita realizar alguna operación en más de una columna porque luego puede especificar un rango de columnas:
foo[foo[ ,c(1:N)], ]
O columnas específicas, como era de esperar.
foo[foo[ ,c(1,5,9)], ]
Otra opción podría ser utilizar la función filtrar de dplyr
. Aquí hay un ejemplo reproducible:
foo = data.frame(location = c("here", "there", "here", "there", "where"), x = 1:5, y = 6:10)
library(dplyr)
filter(foo, location == "there")
#> location x y
#> 1 there 2 7
#> 2 there 4 9
Creado el 2022-09-11 con reprex v2.0.2