R: Cuando se utiliza data.table cómo consigo columnas de y cuando lo haga x [y]?

StackOverflow https://stackoverflow.com/questions/4764434

  •  16-10-2019
  •  | 
  •  

Pregunta

Actualizar . Antiguo pregunta ... se resolvió mediante v1.5.3 data.table en 2011 FEB

Estoy tratando de utilizar el paquete data.table, y realmente como las aceleraciones que estoy recibiendo, pero estoy perplejo 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 ambos 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

ACTUALIZACIÓN ... Para aclarar la funcionalidad Busco en el ejemplo anterior: Necesito hacer el equivalente de los siguientes:

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

Sin embargo, según el siguiente extracto de la AYUDA data.table, 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 significar por unirse alcance heredado. Por qué no acaba de regresar de la unión de todos los columnas de X e Y y, a continuación se ejecutan expresiones sobre esto? Se reduce a eciencia de código y lo que es más rápido programar. Cuando escribes x [y, foo Boo], data.table automáticamente inspecciona la expresión j para ver qué columnas que utiliza. Sólo será un subconjunto, o grupo, esas columnas solamente. Memoria sólo se crea para las columnas de la j usos. foo ejemplo de let es en x, y Boo es en y (junto con otros 20 columnas en y). No es x [y, foo Boo] más rápida de programa y más rápido se ejecuten de un paso de mezcla seguido por otro subconjunto paso?

Soy consciente de esta pregunta que abordar un problema similar, pero no parece haber sido resuelto satisfactoriamente. Alguien sabe lo que me falta o no se entiende? Gracias.

ACTUALIZACIÓN: Pedí ayuda en la lista de correo de la tabla de datos y el autor del paquete (Mateo Dowle) respondieron que efectivamente el FAQ antes citado está mal, por lo que la sintaxis que estoy usando no funciona actualmente, es decir, que no se puede hacer referencia a la columnas y en el argumento j (es decir, segundos) cuando lo haga x[y,...].

¿Fue útil?

Solución

No estoy seguro de si he entendido bien el problema, y ??yo también acabo de empezar a leer la documentación de data.table biblioteca, pero creo que si se desea obtener las columnas de y y también hacer algo para los de las columnas de a , 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

A continuación, se obtiene de vuelta las columnas de y multiplicado por el a de la columna x . Si desea obtener x 's foo multiplicado por y ' s Boo , trate de:

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

Después de editar: Gracias @Prasad Chalasani hacer la pregunta más clara para mí

.

Si se prefiere fusión simple, entonces la siguiente debería funcionar. Hice un dato más complejo 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)

Por lo que sólo una columna adicional se añadió 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 esta última se parece mucho más rápido. Los resultados no son sin embargo idénticas, pero se pueden utilizar de la misma manera (con una columna adicional de esta última pista):

> 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 conseguir xy podríamos usar: xy <- x[,list(x,y)]. Para calcular un data.table de una columna de xy$foo * xy$boo, el siguiente trabajo podría:

> 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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top