Subconjunto/filtrar filas en un marco de datos según una condición en una columna

Resuelto wishihadabettername asked hace 54 años • 3 respuestas

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
wishihadabettername avatar Jan 01 '70 08:01 wishihadabettername
Aceptado

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 Ty Fvalores 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", ]
JoFrhwld avatar Aug 10 '2010 02:08 JoFrhwld

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)], ]
DryLabRebel avatar Oct 01 '2018 04:10 DryLabRebel

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

Quinten avatar Sep 11 '2022 16:09 Quinten