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