2013-04-16 20 views
7

Se ho capito bene, per impostazione predefinita data.table unisce due tabelle confrontando colonne impostate come chiavi e con lo stesso nome. Come dovrei scrivere se ho tabelle con nomi di colonne diversi? Per esempio:unione di tabelle con nomi di colonne diversi

set.seed(123) 
DT1<-data.table(col1=sample(letters,5,replace=TRUE),col2=sample(LETTERS[1:5],5,replace=TRUE),col3=sample(1:2,5,replace=TRUE)) 
DT2<-data.table(col4=sample(1:3,10,replace=TRUE),col5=sample(LETTERS[1:5],10,replace=TRUE),col6=sample(1:100,10,replace=TRUE)) 
(DT1) 
(DT2) 

> (DT1) 
    col1 col2 col3 
1: h A 2 
2: u C 1 
3: k E 2 
4: w C 2 
5: y C 1 
> (DT2) 
    col4 col5 col6 
1: 3 D 48 
2: 1 C 76 
3: 1 C 22 
4: 1 B 32 
5: 3 A 24 
6: 3 E 15 
7: 3 E 42 
8: 2 D 42 
9: 3 D 37 
10: 2 A 16 

Cosa devo scrivere in DT1[ per fare una fusione selezionando solo le righe con col2 == Col5 & col3 == col4? Ecco un output previsto:

col1 col2 col3 col4 col5 col6 
    h A 2 2 A 16 
    u C 1 1 C 76 
    u C 1 1 C 22 
    y C 1 1 C 76 
    y C 1 1 C 22 

Grazie in anticipo!

+0

Puoi mostrarci l'output che ti aspetti? – Arun

+0

sicuro, solo un secondo –

+0

aggiungerò che questa è una buona domanda da tenere a mente quando si cerca di capire perché 'data.table' si è fusa sulle colonne" sbagliate "quando non si sono specificate le chiavi con prudenza. – MichaelChirico

risposta

21

Utilizzando sottoinsieme di data.table base si unisce insieme al recentemente attuato on= argomento e nomatch=0L, questo è semplicemente:

DT2[DT1, on=c(col5="col2", col4="col3"), nomatch=0L] 

Vedi l'secondary indices vignetta di più.


In alternativa, se hai i data.tables digitato, allora si può saltare l'argomento on=. Ma la soluzione di cui sopra sarebbe idiomatica in quanto mantiene l'ordine dei dati originali. Le tabelle, ed è chiaro per dire quali colonne sono state cercate guardando il codice.

setkey(DT1, col2, col3) 
setkey(DT2, col5, col4) 
DT2[DT1, nomatch=0L] 

Vedere la cronologia per le versioni precedenti.

+0

fantastico! Non conoscevo questi dettagli del funzionamento di 'setkey'. Grazie mille! –

Problemi correlati