2012-05-21 14 views
5

Estoy tratando de aprender el paquete data.table en R. Tengo una tabla de datos llamada DT1 y un marco de datos DF1, y me gustaría subconjunto algunas instancias según una condición lógica (disyunción). Este es mi código de momento:¿Cómo traducirías esto al lenguaje del paquete data.table en R?

DF1[DF1$c1==0 | DF1$c2==1,] #the data.frame way with the data.frame DF1 
DT1[DT1$c1==0 | DT1$c2==1,] #the data.frame way with the data.table DT1 

En la página 5 de "Introduction to the data.table package in R", el autor da un ejemplo de algo similar, pero con una conjunción (sustituir | por & en la segunda línea de arriba) y comentarios que es un mal uso de data.table paquete. Sugiere que TODO esta manera siguiente:

setkey(DT1,c1,c2) 
DT1[J(0,1)] 

Por lo tanto, mi pregunta es: ¿Cómo puedo escribir la condición de disyunción con la sintaxis data.table paquete? ¿Es un mal uso mi segunda línea DT1[DT1$c1==0 | DT1$c2==1,]? ¿Hay un equivalente al J pero para la disyunción?

Respuesta

4

En ese documento se indica que se podría haber utilizado:

DT1[c1==0 | c2==1, ] 
+0

Creo que su respuesta es la exploración vectorial. Gracias de todos modos @DWin! – Nestorghh

+0

Sí, eso es 3 escaneos vectoriales (dos '==' y uno '|') más asignaciones de vectores asociadas como se describe en la viñeta introductoria. Ese documento muestra algo similar para demostrar que el uso malo no es bueno. @Nestorghh ¿Pero realmente quiso decir disjuntado en dos columnas ('c1' y' c2')? Dislocada dentro de una columna es la respuesta de Christoph: 'J (c (0,1))'. Disyunto a través de dos columnas es el escaneo vectorial por ahora hasta que se incorporen las claves secundarias, o busque "clave secundaria manual" para un método más oneroso mientras tanto. –

+0

Vi que se llamaba "mala" práctica, pero no vi un ejemplo de "uso correcto" que se aplicaría en este caso de dos columnas, ni encontré uno en las preguntas frecuentes, ni en la búsqueda de los archivos, ni en varios intentos de experimentación. –

3

Aquí hay otra solución:

grpsize = ceiling(1e7/26^2) 
DT <- data.table(
    x=rep(LETTERS,each=26*grpsize), 
    y=rep(letters,each=grpsize), 
    v=runif(grpsize*26^2)) 

setkey(DT, x) 
system.time(DT1 <- DT[x=="A" | x=="Z"]) 
    user system elapsed 
    0.68 0.05 0.74 
system.time(DT2 <- DT[J(c("A", "Z"))]) 
    user system elapsed 
    0.08 0.00 0.07 
all.equal(DT1[, v], DT2[, v]) 
TRUE 

Nota que tomé el ejemplo del documento data.table. La única diferencia es que ya no convierto las letras en factores porque las teclas de caracteres ahora están permitidas (ver NEWS para v 1.8.0).

Una breve explicación: J es la abreviatura de data.table. Así que si usted llama J(0, 1) se crea un data.table con dos columnas que coinciden, al igual que en el ejemplo:

> J(0,1) 
    V1 V2 
[1,] 0 1 

Usted, sin embargo, desea hacer coincidir dos elementos diferentes en una sola columna. Por lo tanto, necesita un data.table con una columna. Así que solo agregue c().

J(c(0,1)) 
    V1 
[1,] 0 
[2,] 1 
+1

+1. Pero OP necesita aclarar: ¿realmente quiso decir disjoint en dos columnas ('c1' y' c2')? Esta respuesta es buena para separar dentro de una columna. –

+0

@MatthewDowle Correcto, me lo perdí ... supongo que el OP significaba realmente uniones en dos columnas. –

+0

@MatthewDowle & @Christoph_J, quise decir disjuntos entre dos columnas '' c1'' y '' c2'' de mi '' data.table'' 'DT1''. ¿Tengo que hacerlo en el modo de exploración vectorial entonces?Gracias – Nestorghh

Cuestiones relacionadas