2011-01-21 9 views
13

ACTUALIZACIÓN: Antiguo pregunta ... se resolvió mediante v1.5.3 data.table en febrero de 2011.R: Cuando uso data.table, ¿cómo obtengo las columnas de y cuando hago x [y]?

Estoy tratando de utilizar el paquete data.table, y realmente como las aceleraciones que estoy recibiendo, pero estoy confundido por este error cuando hago x[y, <expr>] donde x y y son "tablas de datos" con la misma clave, y <expr> contiene nombres de columna de tanto x y y:

require(data.table) 
x <- data.table(foo = 1:5, a = 5:1) 
y <- data.table(foo = 1:5, boo = 10:14) 
setkey(x, foo) 
setkey(y, foo) 
> x[y, foo*boo] 
Error in eval(expr, envir, enclos) : object 'boo' not found 

UPDA TE ... para aclarar la funcionalidad Busco en el ejemplo anterior: Necesito hacer el equivalente de los siguientes:

with(merge(x,y), foo*boo) 

Sin embargo de acuerdo con el siguiente fragmento de la data.table FAQ, esto debería haber trabajado :

por último, a pesar de que parece como si x [y] no devuelve las columnas en y, en realidad se puede utilizar las columnas de y en la expresión j. Esto es lo que significa al unir alcance heredado. ¿Por qué no simplemente devuelve la unión de todas las columnas de xey y luego ejecuta expresiones sobre eso? Se reduce a eciencia de código y lo que es más rápido para programar. Cuando escribe x [y, foo boo], data.table automáticamente inspecciona la expresión j para ver qué columnas utiliza. Solo subconjunto, o grupo, esas columnas solamente. La memoria solo se crea para las columnas que utiliza j . Digamos que foo está en x, y boo está en y (junto con otras 20 columnas en y). ¿No es x [y, foo boo] más rápido al programa y más rápido de ejecutar que un paso de fusión seguido de otro subconjunto paso?

Soy consciente de this question que abordó un problema similar, pero no parece haberse resuelto satisfactoriamente. ¿Alguien sabe lo que me estoy perdiendo o entendiendo mal? Gracias.

ACTUALIZACIÓN: pregunté en la lista de correo de ayuda de la tabla de datos y el autor del paquete (Matthew Dowle) replied que de hecho las preguntas más frecuentes antes citadas son incorrectas, por lo que la sintaxis que estoy utilizando no funcionará actualmente, es decir, no puedo consultar las columnas y en el argumento j (es decir, el segundo) cuando hago x[y,...].

+0

Pero lo solicitó hace un tiempo y fue tratado por v1.5.3 lanzado a CRAN en febrero de 2011. Consulte las NOTICIAS, las nuevas preguntas frecuentes sobre data.table y las corregidas. –

+0

@Matthew, gracias, sí, sé que ha sido abordado por el último lanzamiento, y me alegra que lo haya indicado aquí, así que está claro para los demás. –

Respuesta

4

No estoy seguro si entiendo bien el problema, y ​​también comencé a leer los datos de .tabla biblioteca, pero creo que si le gustaría obtener las columnas de y y también hacer algo para los de las columnas de un, puede intentar algo como:

> x[y,a*y] 
    foo boo 
[1,] 5 50 
[2,] 8 44 
[3,] 9 36 
[4,] 8 26 
[5,] 5 14 

Aquí, se obtiene respaldar las columnas de y multiplicadas por una columna de x. Si desea obtener x 's foo multiplica por y' s Boo, Proveedores:

> y[,x*boo] 
    foo a 
[1,] 10 50 
[2,] 22 44 
[3,] 36 36 
[4,] 52 26 
[5,] 70 14 

Después de la edición: gracias @Prasad Chalasani hacer más clara la cuestión para mi.

Si se prefiere la fusión simple, entonces lo siguiente debería funcionar. Hice un conjunto de datos más complejos para ver las acciones más profundo:

x <- data.table(foo = 1:5, a=20:24, zoo = 5:1) 
y <- data.table(foo = 1:5, b=30:34, boo = 10:14) 
setkey(x, foo) 
setkey(y, foo) 

Así que sólo se añadió una columna adicional a cada data.table. Veamos merge y hacerlo con data.tables:

> system.time(merge(x,y)) 
    user system elapsed 
    0.027 0.000 0.023 
> system.time(x[,list(y,x)]) 
    user system elapsed 
    0.003 0.000 0.006 

Desde que éste se parece mucho más rápido. Los resultados no son idénticos, aunque, pero se pueden utilizar de la misma manera (con una columna adicional de este último plazo):

> merge(x,y) 
    foo a zoo b boo 
[1,] 1 20 5 30 10 
[2,] 2 21 4 31 11 
[3,] 3 22 3 32 12 
[4,] 4 23 2 33 13 
[5,] 5 24 1 34 14 
> x[,list(x,y)] 
    foo a zoo foo.1 b boo 
[1,] 1 20 5  1 30 10 
[2,] 2 21 4  2 31 11 
[3,] 3 22 3  3 32 12 
[4,] 4 23 2  4 33 13 
[5,] 5 24 1  5 34 14 

Así que para obtener xy podríamos usar: xy <- x[,list(x,y)]. Para calcular un data.table de una columna de xy$foo * xy$boo, la siguiente podría funcionar:

> xy[,foo*boo] 
[1] 10 22 36 52 70 

Bueno, el resultado no es un data.table pero un vector en su lugar.


Actualización (29/03/2012): gracias por @ David para señalar mi atención al hecho de que merge.data.table se utilizaron en los ejemplos anteriores.

+0

En referencia al ejemplo de mi pregunta, quiero hacer una combinación de 'x' y' y', vamos a llamarlo 'xy', y luego crear un marco de datos de una sola columna que sea igual a' xy $ foo * xy $ boo'. –

+0

@Prasad Chalasani: Edité mi respuesta, espero que puedas encontrar algo nuevo y valioso en ella. – daroczig

+0

gracias por los detalles, pero mi pregunta fue sobre por qué la sintaxis específica que describo en mi pregunta no funciona, al contrario de lo que dice en las preguntas frecuentes. Sé que puedo hacerlo en dos etapas (fusionar, luego operar en columnas), pero quiero que la sintaxis 'x [y, ]' funcione * en un solo paso * - es decir, unirme y operar en ' x' y 'y' columnas en un solo paso. Esto es sintácticamente menos tedioso, y posiblemente más rápido (si se implementa internamente). Estoy lidiando con marcos de datos de 10 millones de filas, por lo que no estoy preocupado con los tiempos del ejemplo de juguete pequeño anterior. –

Cuestiones relacionadas