2015-04-25 10 views
19

Ho due data.table X e Y.Come unire due data.table con nomi di colonne diversi?

colonne in X: area, id, value
colonne in Y: ID, price, sales

creare le due data.tables:

X = data.table(area=c('US', 'UK', 'EU'), 
       id=c('c001', 'c002', 'c003'), 
       value=c(100, 200, 300) 
      ) 

Y = data.table(ID=c('c001', 'c002', 'c003'), 
       price=c(500, 200, 400), 
       sales=c(20, 30, 15) 
      ) 

E io impostare le chiavi per X e Y :

setkey(X, id) 
setkey(Y, ID) 

Ora cerco di unire X e Y da id in X e ID in Y:

merge(X, Y) 
merge(X, Y, by=c('id', 'ID')) 
merge(X, Y, by.x='id', by.y='ID') 

Tutto errore sollevato dicendo che i nomi delle colonne nella by argomento non valido.

Mi sono riferito al manuale di data.table e ho trovato la funzione merge che non supporta gli argomenti by.x e by.y.

Come posso unire due data.tables con nomi di colonna diversi senza modificare i nomi delle colonne?

Append:
sono riuscito a unire le due tabelle X[Y], ma perché merge funzione fallisce in data.table?

+4

Si prega di controllare http://stackoverflow.com/questions/16047253/merging-tables-with-different-column-names o http: // stackoverflow.com/questions/27612859/joining-tables-based-on-different-column-names – akrun

+0

@akrun Grazie. Ho controllato i due post. Sono riuscito a unire ** X ** e ** Y ** di 'X [Y]', ma non riuscivo ancora a realizzarlo usando la funzione 'unione '. Sono abbastanza confuso sul perché 'merge' fallisce in data.table. – Zelong

+2

by.x e by.y non sono ancora stati implementati per data.tables. Un FR è archiviato. Controlla http://stackoverflow.com/questions/14069796/merging-data-tables-based-on-columns-names –

risposta

12

Utilizzare questa operazione:

X[Y] 
# area id value price sales 
# 1: US c001 100 500 20 
# 2: UK c002 200 200 30 
# 3: EU c003 300 400 15 

o questa operazione:

Y[X] 
#  ID price sales area value 
# 1: c001 500 20 US 100 
# 2: c002 200 30 UK 200 
# 3: c003 400 15 EU 300 

Modifica dopo aver modificato la tua domanda, ho letto la sezione 1.12 del FAQ: "Qual è il didifference tra X [Y] e unisci (X, Y)? ", Che mi ha portato a effettuare il checkout ?merge e ho scoperto che esistono due diverse funzioni di unione a seconda del pacchetto che stai utilizzando. L'impostazione predefinita è merge.data.frame ma data.table utilizza merge.data.table. Confronta

merge(X, Y, by.x = "id", by.y = "ID") # which is merge.data.table 
# Error in merge.data.table(X, Y, by.x = "id", by.y = "ID") : 
# A non-empty vector of column names for `by` is required. 

con

merge.data.frame(X, Y, by.x = "id", by.y = "ID") 
#  id area value price sales 
# 1 c001 US 100 500 20 
# 2 c002 UK 200 200 30 
# 3 c003 EU 300 400 15 

Modifica per completezza basato su un comment da @ Michael Bernsteiner, sembra che la squadra data.table sta progettando di attuare by.x e by.y nella funzione merge.data.table, ma hasn ancora fatto.

3

L'unione non riesce quando si utilizza by.x e by.y con data.table. Prendendo i dati:

> merge(X,Y, by.x='id', by.y='ID') 
Error in merge.data.table(X, Y, by.x = "id", by.y = "ID") 

È possibile utilizzare data.table con merge, ma è necessario utilizzare by argomento per unire (in modo da rinominare le colonne per avere lo stesso colnames)

Y = setNames(Y,c('id','price','sales')) 

Questo ancora non funziona :

merge(X,Y, by.x='id', by.y='id') 
Error in merge.data.table(X, Y, by.x = "id", by.y = "id") : 

Ma questo funzionerà:

> merge(X,Y, by='id') 
#  id area value price sales 
#1: c001 US 100 500 20 
#2: c002 UK 200 200 30 
#3: c003 EU 300 400 15 

In alternativa, si avrebbe bisogno di convertire data.table-data.frame al fine di utilizzare merge con by.x e by.y argomenti:

merge(data.frame(X), data.frame(Y), by.x='id', by.y='ID') 
+0

Si potrebbe anche fare 'library (dplyr); XY <- setDT (left_join (tbl_df (X), tbl_df (Y), per = c ("id" = "ID"))) ' –

+0

Dato gli aggiornamenti a' data.table' questa risposta non è più corretta – tospig

16

partire dalla versione 1.9.6 data.table (su CRAN su settembre 2015) è possibile specificare la by.x e by.y argomenti a data.table::merge

merge(x=X, y=Y, by.x="id", by.y="ID")[] 
#  id area value price sales 
#1: c001 US 100 500 20 
#2: c002 UK 200 200 30 
#3: c003 EU 300 400 15 

Tuttavia, in 1.9.6 data.table si può anche specfy l'argomento on nella notazione X[Y]

X [Y] sintassi ora possono partecipare senza dover impostare chiavi utilizzando il nuovo sull'argomento. Ad esempio: DT1 [DT2, on = c (x = "y")] unirebbe la colonna "y" di DT2 con "x" di DT1. DT1 [DT2, on = "y"] si unirebbe alla colonna "y" di entrambi i dati.tables.

X[Y, on=c(id = "ID")] 
# area id value price sales 
#1: US c001 100 500 20 
#2: UK c002 200 200 30 
#3: EU c003 300 400 15 

this answer dal data.table autore ha maggiori dettagli

+0

è la vera risposta a questo punto ... –

+0

È meglio usare il primo merthod o il secondo? – skan

+1

@skan - Non sono sicuro di poter dire quale sia "migliore". Tieni presente che 'data.table :: merge' imposta' sort = TRUE' per impostazione predefinita, che imposterà una chiave sui dati risultanti. Questo è qualcosa a cui prestare attenzione se non stai usando le chiavi – tospig