Pregunta

Nota: esta pregunta y las siguientes respuestas se refieren a versiones data.table <1.5.3; . V 1.5.3 fue lanzado en febrero de 2011 para resolver este problema Vea más reciente tratamiento (03-2012):. Traducción uniones SQL de claves externas a R data.table sintaxis


He estado cavando a través de la documentación de los datos de la . paquete de tabla (un reemplazo para data.frame que es mucho más eficiente para ciertas operaciones), incluyendo presentación de Josh Reich en SQL y data.table en la ciudad de Nueva York R Meetup (pdf), pero no puede entender esta operación totalmente trivial a cabo.

> x <- DT(a=1:3, b=2:4, key='a')
> x
     a b
[1,] 1 2
[2,] 2 3
[3,] 3 4
> y <- DT(a=1:3, c=c('a','b','c'), key='a')
> y
     a c
[1,] 1 a
[2,] 2 b
[3,] 3 c
> x[y]
     a b
[1,] 1 2
[2,] 2 3
[3,] 3 4
> merge(x,y)
  a b c
1 1 2 a
2 2 3 b
3 3 4 c

Los documentos dicen "Cuando [el primer argumento] es en sí mismo un data.table, una se invoca la combinación similar a basar :: fusión, pero utiliza búsqueda binaria en la tecla ordenada." Claramente este no es el caso. ¿Puedo obtener las otras columnas de Y en el resultado de x [y] con data.tables? Parece que acaba de tomar las filas de x donde la clave coincide con la clave de Y, pero ignorando el resto de y totalmente ...

¿Fue útil?

Solución

Se está citando la parte equivocada de la documentación. Si usted tiene una mirada en el documento de [.data.table se lee:

  

Cuando i es un data.table, x debe tener una   clave, significado unirse a i y return x   las filas de X que coincidan . Una combinación de igualdad   se lleva a cabo entre cada columna en i   a cada columna de clave de x en orden.   Esto es similar a la base R   funcionalidad de sub- establecer una matriz   por una matriz 2-columna, y en una mayor   dimensiones de subconjuntos un n-dimensional   matriz por una matriz de n-columna

Admito la descripción del paquete (la parte que se citan) es algo confuso, ya que parece decir que el "[" -operación se puede utilizar en lugar de fusión. Pero creo que lo que dice es:. Si X e Y son ambos data.tables usamos una combinación en un índice (que se invoca como fusión) en lugar de la búsqueda binaria


Una cosa más:

La biblioteca data.table he instalado a través de install.packages faltaba la merge.data.table method, así que usar merge llamaría merge.data.frame. Después de instalar el paquete rel="noreferrer"> href="http://r-forge.r-project.org/projects/datatable/" R utilizado el método más rápido merge.data.table.

Puede comprobar si tiene el método merge.data.table marcando la salida de:

methods(generic.function="merge")

EDITAR [ya no respuesta válida]: Esta respuesta se refiere a la versión data.table 1.3. En la versión 1.5.3 del comportamiento de data.table cambió y x [y] devuelve los resultados esperados. Gracias Mateo Dowle , autor de data.table, por señalar esto en los comentarios.

Otros consejos

Gracias por las respuestas. Echaba de menos este hilo cuando fue originalmente publicado. data.table ha cambiado desde febrero. 1.4.1 fue lanzado a Cran hace un tiempo y 1.5 es muy pronto. Por ejemplo, el DT () alias se ha sustituido con la lista (); como una primitiva es mucho más rápido, y data.table hereda ahora de hoja.de.datos por lo que funciona con paquetes que solamente Aceptar hoja.de.datos como ggplot y celosía, sin necesidad de conversión (más rápido y más conveniente ).

¿Es posible suscribirse a la etiqueta data.table por lo que obtener un correo electrónico cuando alguien envía una pregunta con esa etiqueta? La lista de tabla de datos-ayuda ha crecido hasta unos 30-40 mensajes al mes, pero estoy feliz de responder aquí también si puedo conseguir algún tipo de notificación.

Matthew

Creo que el uso de la función base::merge no se necesita, como el uso de data.table une puede ser mucho más rápido. P.ej. consulte la siguiente. Hago x y y data.tables con 3-3 columnas:

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)

Y fusionar ambas con base:merge y data.table se une a ver la velocidad de ejecuciones:

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 

Los resultados no son idénticos, ya que este último tiene una columna extra:

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

Lo que no podía hacer un gran problema:)

Creo que f3lix es correcta y que la documentación es un poco engañoso. El beneficio está en hacer una unión rápida al subconjunto de los datos. Todavía en última instancia, es necesario utilizar la función merge después como en el ejemplo anterior.

presentación de Josh sobre el uso de datos .table que así es como funciona su ejemplo. La primera vez que subconjuntos uno de los data.tables, luego hace una fusión:

library(data.table)
sdt <- DT(series, key='series_id')
ddt <- DT(data, key='series_id')
u <- sdt[ grepl('^[A-Z]{2}URN', fred_id) & !grepl('DSURN', fred_id) ]
d <- ddt[ u, DT(min=min(value)), by='series_id', mult='all']
data <- merge(d,series)[,c('title','min','mean','max')]
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top