r merge data.table

Cómo hacer una operación de fusión de data.table



merge (4)

Creo que f3lix es correcto y que la documentación es un poco engañosa. El beneficio está en hacer una unión rápida para subconjuntos de los datos. En última instancia, en última instancia, necesitará utilizar la función de merge como en el ejemplo anterior.

Verá en la presentación de Josh sobre el uso de data.table que así es como se ejecuta su ejemplo. Primero 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'')]

nota: esta pregunta y las siguientes respuestas se refieren a data.table versions <1.5.3; v. 1.5.3 fue lanzado en febrero de 2011 para resolver este problema. ver tratamiento más reciente (03-2012): Traducir uniones de SQL en claves externas a la sintaxis de R data.table

He estado revisando la documentación del paquete data.table (un reemplazo para data.frame que es mucho más eficiente para ciertas operaciones), incluida la presentación de Josh Reich sobre SQL y data.table en el NYC R Meetup (pdf), pero no puede imaginarse esta operación totalmente trivial.

> 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, se invoca un join similar a base :: merge, pero usa la búsqueda binaria en la clave 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 solo está tomando las filas de x donde la tecla coincide con la clave de y, pero ignorando el resto de y completamente ...


Creo que no es necesario usar la función base::merge data.table , ya que el uso de data.table uniones data.table puede ser mucho más rápido. Ej. Vea lo siguiente. Realizo 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 data.table ambos con base:merge y data.table une para ver la velocidad de las 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 adicional:

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 cual no podría ser un gran problema :)


Gracias por las respuestas. Me perdí este hilo cuando fue publicado originalmente. data.table ha cambiado desde febrero. 1.4.1 fue lanzado a CRAN hace un tiempo y 1.5 sale pronto. Por ejemplo, el alias DT () ha sido reemplazado por list (); como una primitiva es mucho más rápida, y data.table ahora hereda de data.frame por lo que funciona con paquetes que solo aceptan data.frame como ggplot y reticulado, sin ninguna conversión requerida (más rápido y más conveniente).

¿Es posible suscribirse a la etiqueta data.table para recibir un correo electrónico cuando alguien publica una pregunta con esa etiqueta? La lista de ayuda de tabla de datos ha crecido a unos 30-40 mensajes al mes, pero me complace responder aquí también si puedo recibir algún tipo de notificación.

Matthew


Usted está citando la parte incorrecta de la documentación. Si [.data.table un vistazo al documento de [.data.table leerás:

Cuando yo soy una tabla de datos, x debe tener una clave, lo que significa unir i a x y devolver las filas en x que coincidan . Se realiza una unión equitativa entre cada columna en i a cada columna en la clave de x en orden. Esto es similar a la funcionalidad de la base R de establecer una matriz mediante una matriz de 2 columnas, y en dimensiones superiores subconjunto una matriz n-dimensional por una matriz de n-columna

Admito que la descripción del paquete (la parte que citó) es algo confusa, porque parece decir que se puede usar la operación "[" en lugar de fusionar. Pero creo que lo que dice es: si xey son ambos data.tables usamos un join en un índice (que se invoca como merge) en lugar de la búsqueda binaria.

Una cosa más:

La biblioteca data.table que instalé a través de install.packages merge.data.table method , por lo que al usar merge se llamaría merge.data.frame . Después de instalar el paquete de R-Forge R, se utilizó el método merge.data.table más merge.data.table .

Puede verificar si tiene el método merge.data.table comprobando el resultado de:

methods(generic.function="merge")

EDITAR [Respuesta no válida más]: esta respuesta se refiere a data.table versión 1.3. En la versión 1.5.3, el comportamiento de data.table cambió yx [y] devuelve los resultados esperados. Gracias Matthew Dowle , autor de data.table, por señalar esto en los comentarios.