2012-07-05 1 views
5

Vorrei unirmi a due data.table s utilizzando la data come join.Unire data.table alla data esatta o, in caso contrario, al meno recente della data

Beh, a volte non ho avuto una corrispondenza esatta e in questo caso mi piacerebbe trovare la data meno vicina. Il mio probleme è molto simile a questo post su SQL: SQL Join on Nearest less than date

so data.table sintassi è analoga a SQL ma non posso codificare questo. Qual è la sintassi corretta?

Un esempio semplificato:

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 

uscita

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

Grazie in anticipo.

risposta

6

Qui si va:

library(data.table) 

creare i dati:

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) 

Converti in data.table, convertire le stringhe di date, e impostare la data.table chiave:

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) 

Partecipa l tavoli, utilizzando 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 Sono contento che questa risposta ti abbia aiutato. Per riferimento futuro: aiuta molto se fornisci un codice riproducibile nella tua domanda - questo incoraggia le persone a rispondere, poiché significa che non dobbiamo ricreare il tuo problema da zero, come ho fatto qui. Inoltre, se hai pubblicato il tuo codice con un messaggio di errore, avremmo potuto spiegare perché si verifica questo messaggio di errore e come procedere per risolverlo. – Andrie

+1

Grazie Andrie e Matteo per le tue risposte! Avevo visto questo parametro "rollare" quando ho letto la documentazione. L'ho provato prima ma non funziona, ho avuto questo output Erreur dans '[.data.table' (pixel, Trep, roll = T): Tentativo di roll join sulla colonna dei fattori i.date. Solo le colonne numero intero, doppio o carattere possono essere unite. Ho avuto un problema di formato data. Ora capisco il mio problema con il formato data. grazie mille per più tempo – mat

+0

Ho notato che per futur. Grazie – 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 

Questa è una delle caratteristiche principali di data.table. Poiché le righe sono ordinate (a differenza di SQL) questa operazione è semplice e molto veloce. SQL è intrinsecamente non ordinato, quindi è necessario un self join e "ordina per" per eseguire questa operazione. Può essere fatto in SQL e funziona, ma può essere lento e richiede più codice. Poiché SQL è un archivio di riga, anche in SQL di memoria, ha un limite inferiore determinato dal recupero di pagine dalla RAM nella cache L2. data.table è inferiore al limite inferiore perché è un archivio colonne.

Le 2 vignette si trovano anche su homepage.