una tabla studio seleccionar numero filas extraer especificas datos data contar como r select subset data.table

tabla - ¿Cómo selecciono las filas por dos criterios en data.table en R?



seleccionar filas en r (2)

Digamos que tengo una tabla de datos y quiero seleccionar todas las filas donde la variable x tiene un valor de b. Eso es fácil

library(data.table) DT <- data.table(x=rep(c("a","b","c"),each=3), y=c(1,3,6), v=1:9) setkey(DT,x) # set a 1-column key DT["b"]

Por cierto, parece que uno tiene que establecer una clave, si la clave no está configurada en x entonces esto no funciona. Por cierto, ¿qué pasaría si configuro dos columnas como claves?

De todos modos, avanzando, digamos que quiero seleccionar todas las filas donde la variable x era a o b

DT["b"|"a"]

No funciona

Pero los siguientes trabajos

DT[x=="a"|x=="b"]

Pero eso usa escaneo vectorial a los marcos de datos. No usa la búsqueda binaria. Supongo que para conjuntos de datos más pequeños no importará.

¿Es eso lo que debería hacer o no conozco la sintaxis de data.table?

Y una cosa más. ¿Hay algún ejemplo de procedimientos de selección (o subconjuntos) booleanos más complejos de variables múltiples con data.table?

Sé que siempre podría volver a usar la función subconjunto () ya que una tabla de datos se comportará como un data.frame si es necesario.


Esta es una forma que solo cruzó por mi mente después de que hice la pregunta y funciona, pero no sé cómo funciona en los puntos de referencia. Actualmente no estoy en una computadora con una R. instalada. Supongo que debería usar una instancia en la nube. De todos modos, me gusta la sintaxis

DT[c("a","b")]


Usar el operador %in% parece dar un factor de 2 aumento de rendimiento. Considerar:

library(data.table) library(rbenchmark) DT <- data.table(x=sample(letters, 1e6, TRUE), y=rnorm(1e6), v=runif(1e6)) setkey(DT,x) # set a 1-column key DT["b"] f1 <- function() DT[x %in% letters[1:2]] f2 <- function() DT[x=="a"| x == "b"] > benchmark(f1(),f2()) test replications elapsed relative user.self sys.self user.child sys.child 1 f1() 100 8.40 1.000000 7.58 0.81 NA NA 2 f2() 100 17.11 2.036905 15.54 1.56 NA NA > all.equal(f1(), f2()) [1] TRUE

EDITAR: Agregar la opción de Farrel

Tenga en cuenta que esto es en una computadora diferente, pero los baches relativos son los mismos.

f3 <- function() DT[c("a", "b")] test replications elapsed relative user.self sys.self user.child sys.child 1 f1() 100 11.281 7.121843 9.745 1.323 0 0 2 f2() 100 23.106 14.587121 20.824 2.224 0 0 3 f3() 100 1.584 1.000000 1.042 0.541 0 0