2011-12-14 6 views
21

Digamos que tengo una data.table y quiero seleccionar todas las filas donde la variable x tiene un valor de b. Eso es fácil¿Cómo selecciono las filas por dos criterios en data.table en R

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á establecido en x, entonces esto no funciona. Por cierto, ¿qué pasaría si configuro dos columnas como claves?

De todos modos, se mueve a lo largo de, digamos que yo quiero para seleccionar todas las filas en las que la variable x era aob

DT["b"|"a"] 

no funciona

Pero las siguientes obras

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

Pero eso usa el 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á.

¿Eso es 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 utilizar la función subconjunto() ya que una data.table se comportará como un data.frame si es necesario.

+2

En la viñeta de introducción se muestra un ejemplo detallado de la clave de varias columnas. –

+2

Y no estoy seguro de qué tan conocido es trabajar con el resultado de 'example (data.table)' en el prompt - hay ejemplos. –

Respuesta

13

Esta es una manera que solo cruzó 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")] 
+1

He añadido esto a la referencia a continuación, realiza el más rápido con diferencia de las tres soluciones. Buen trabajo. – Chase

+1

Genial. Esto se conoce como _by sin by_, a.k.a. _agrupando por 'i'_. Algo análogo a _having_ en SQL. –

+3

Cuando tenga el truco de agrupar por 'i', el próximo paso de aprendizaje es _ unirse al alcance heredado_. Ejecute 'example (data.table)' y los resultados muestran un ejemplo. –

13

El uso del operador %in% parece dar un factor de 2 aumento de rendimiento. Consideremos:

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 

EDIT: Adición de opción de Farrel

Nota, esto es en un equipo diferente, pero los golpes 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 
Cuestiones relacionadas