2012-07-05 11 views
5

Me gustaría unir dos data.table s usando la fecha como unión.Unirme a data.table en la fecha exacta o si no es el caso en la fecha más cercana a menos de

Bueno, a veces no tenía una coincidencia exacta y en este caso me gustaría encontrar la fecha menos cercana. Mi probleme es muy similar a este post acerca de SQL: SQL Join on Nearest less than date

data.table sintaxis es similar a SQL pero no puede codificar esto. ¿Cual es la sintaxis correcta?

Un ejemplo simplificado:

Dt1 
    date  x 
1/26/2010 - 10 
1/25/2010 - 9 
1/24/2010 - 9 
1/22/2010 - 7  
1/19/2010 - 11 

Dt2 
    date 
1/26/2010 
1/23/2010 
1/20/2010 

salida

date  x 
1/26/2010 - 10 
1/23/2010 - 7 
1/20/2010 - 11 

Gracias de antemano.

Respuesta

6

Aquí van:

library(data.table) 

crear los datos:

Dt1 <- read.table(text=" 
date  x 
1/26/2010, 10 
1/25/2010, 9 
1/24/2010, 9 
1/22/2010, 7  
1/19/2010, 11", header=TRUE, stringsAsFactors=FALSE) 

Dt2 <- read.table(text=" 
date 
1/26/2010 
1/23/2010 
1/20/2010", header=TRUE, stringsAsFactors=FALSE) 

Convertir a data.table, convertir cadenas en fechas y ajuste su data.table clave:

Dt1 <- data.table(Dt1) 
Dt2 <- data.table(Dt2) 

Dt1[, date:=as.Date(date, format=("%m/%d/%Y"))] 
Dt2[, date:=as.Date(date, format=("%m/%d/%Y"))] 

setkey(Dt1, date) 
setkey(Dt2, date) 

Únete a la tablas, usando roll=TRUE:

Dt1[Dt2, roll=TRUE] 

      date x 
[1,] 2010-01-20 11 
[2,] 2010-01-23 7 
[3,] 2010-01-26 10 
+3

@mat Me alegra que esta respuesta te haya ayudado. Para referencia futura: ayuda mucho si proporciona un código reproducible en su pregunta; esto alienta a las personas a responder, ya que significa que no tenemos que volver a crear su problema desde cero, como he hecho aquí. Además, si publicó su código con un mensaje de error, podríamos haber explicado por qué ocurre ese mensaje de error y cómo debe solucionarlo. – Andrie

+1

¡Agradezca a Andrie y a Matthew sus respuestas! Había visto este parámetro "rodar" cuando leí la documentación. Lo intenté antes pero no funciona, tuve esta salida Erreur dans '[.data.table' (pixel, Trep, roll = T): Intentando unir rollo en la columna factor i.date. Solo las columnas de números enteros, dobles o de caracteres pueden unirse. Tuve un problema de formato de fecha. Ahora entiendo mi problema con el formato de fecha. muchas gracias en más tiempo. – mat

+0

Noté que para futur. Gracias – mat

2
?data.table     # search for the `roll` argument 
example(data.table)   # search for the example using roll=TRUE 
vignette("datatable-intro") # see section "3: Fast time series join" 
vignette("datatable-faq") # see FAQs 2.16 and 2.20 

Esta es una de las características principales de data.table. Como las filas están ordenadas (a diferencia de SQL), esta operación es simple y muy rápida. SQL está inherentemente desordenado, por lo que necesita una auto-unión y 'ordenar por' para realizar esta tarea. Se puede hacer en SQL y funciona, pero puede ser lento y necesita más código. Como SQL es un almacén de filas, incluso el SQL en memoria, tiene un límite inferior determinado por las capturas de página desde la memoria RAM a la memoria caché L2. data.table está por debajo de ese límite inferior porque es un almacén de columnas.

Las 2 viñetas también están en el homepage.

Cuestiones relacionadas