una tamaño tabla studio seleccionar matrices funcion filas eliminar datos data contar como r subset r-faq

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 el data.frame en un data.table (que es una forma mejorada de un data.frame ) con la columna fct 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)