tamaño - Seleccionar filas de un marco de datos basado en valores en un vector
seleccionar filas en r (3)
Eche un vistazo a ?"%in%"
.
dt[dt$fct %in% vc,]
fct X
1 a 2
3 c 3
5 c 5
7 a 7
9 c 9
10 a 1
12 c 2
14 c 4
También podría usar ?is.element
:
dt[is.element(dt$fct, vc),]
Tengo datos similares a esto:
dt <- structure(list(fct = structure(c(1L, 2L, 3L, 4L, 3L, 4L, 1L, 2L, 3L, 1L, 2L, 3L, 2L, 3L, 4L), .Label = c("a", "b", "c", "d"), class = "factor"), X = c(2L, 4L, 3L, 2L, 5L, 4L, 7L, 2L, 9L, 1L, 4L, 2L, 5L, 4L, 2L)), .Names = c("fct", "X"), class = "data.frame", row.names = c(NA, -15L))
Quiero seleccionar filas de este marco de datos en función de los valores en la variable fct
. Por ejemplo, si deseo seleccionar filas que contengan "a" o "c", puedo hacer esto:
dt[dt$fct == ''a'' | dt$fct == ''c'', ]
cuyos rendimientos
1 a 2
3 c 3
5 c 5
7 a 7
9 c 9
10 a 1
12 c 2
14 c 4
como se esperaba. Pero mis datos reales son más complejos y realmente quiero seleccionar filas basadas en los valores de un vector como
vc <- c(''a'', ''c'')
Así que lo intenté
dt[dt$fct == vc, ]
pero por supuesto que eso no funciona. Sé que podría codificar algo para recorrer el vector y sacar las filas necesarias y anexarlas a un nuevo marco de datos, pero esperaba que hubiera una manera más elegante.
Entonces, ¿cómo puedo filtrar / subconjuntar mis datos en función del contenido del vector vc
?
Otra opción sería usar una data.table
con data.table
:
library(data.table)
setDT(dt, key = ''fct'')[J(vc)] # or: setDT(dt, key = ''fct'')[.(vc)]
lo que resulta en:
fct X
1: a 2
2: a 7
3: a 1
4: c 3
5: c 5
6: c 9
7: c 2
8: c 4
Que hace esto?
-
setDT(dt, key = ''fct'')
transforma eldata.frame
en undata.table
(que es una forma mejorada de undata.frame
) con la columnafct
configurada como clave. - A continuación, puede subconjunto con el vector
vc
con[J(vc)]
.
NOTA: cuando la clave es una variable de factor / carácter, también puede usar setDT(dt, key = ''fct'')[vc]
pero eso no funcionará cuando vc
sea un vector numérico. Cuando vc
es un vector numérico y no está envuelto en J()
o .()
, vc
funcionará como un rowindex.
Se puede encontrar una explicación más detallada del concepto de claves y subconjuntos en las teclas de viñeta y en el subconjunto basado en búsqueda binaria rápida .
Una alternativa sugerida por @Frank en los comentarios:
setDT(dt)[J(vc), on=.(fct)]
Cuando vc
contiene valores que no están presentes en dt
, deberá agregar nomatch = 0
:
setDT(dt, key = ''fct'')[J(vc), nomatch = 0]
o:
setDT(dt)[J(vc), on=.(fct), nomatch = 0]
Similar a la anterior, usando el filter
de dplyr
:
filter(df, fct %in% vc)