2013-02-21 15 views
8

Mi piacerebbe creare una nuova colonna key nel mio data.table attraverso la fusione con una tabella di ricerca da colonne comuni index1 & index2. Poi dai valori di questa nuova key colonna (a, b, c), desidero generare 3 nuove colonne (a, b, c) che indici colonna value nel data.table.Alla ricerca di un modo migliore per aggiungere colonne in data.table dalla tabella di ricerca

miei sguardi data.table come questo:

index1  index2 value 
1  2   0  0.00 
2  1   2 -5.00 
3  3   2 -5.00 
4  3   2 17.50 
5  2   2 15.00 
6  1   2 -7.50 
7  3   2  3.75 
8  1   2 -8.75 
9  2   1 15.00 
10  2   1 12.50 

La tabella di ricerca è questo:

index1 index2 key 
1 1  1 a 
2 1  2 b 
3 2  1 a 
4 2  2 c 
5 3  1 c 
6 3  2 b 

Il risultato finale è simile a questo:

index1  index2 value key  a  b  c 
1  2   0  0.00 NA  NA  NA  NA 
2  1   2 -5.00 b  NA -5.00  NA 
3  3   2 -5.00 b  NA -5.00  NA 
4  3   2 17.50 b  NA 17.50  NA 
5  2   2 15.00 c  NA  NA 15.00 
6  1   2 -7.50 b  NA -7.50  NA 
7  3   2  3.75 b  NA 3.75  NA 
8  1   2 -8.75 b  NA -8.75  NA 
9  2   1 15.00 a 15.00  NA  NA 
10  2   1 12.50 a 12.50  NA  NA 

ho provato risolverlo fondendo prima data.table e la tabella di ricerca per merge(), quindi utilizzato J() thre e tempi separati per raggiungere il risultato sopra. Sono abbastanza nuovo di data.table, ma mi piacerebbe imparare un modo più elegante per risolvere questo problema invece di ripetere la procedura più volte. Qui è il mio codice:

DT <- merge(DT, lookup, by=c('index1', 'index2'), all.x=TRUE) 
DT <- data.table(DT) #Don't know why but DT became a data.frame after merge() 
DT[J("a"), a:=value] 
DT[J("b"), b:=value] 
DT[J("c"), c:=value] 
+1

Non ho capito bene l'ultima parte: 'Mi piacerebbe generare 3 nuove colonne (a, b, c) che indichino il valore in data.table)'. Cosa intendi qui? Potrebbe mostrare il tuo output finale? Inoltre, come vuoi gestire i tasti 'NA'? la fusione di entrambi i modi crea 'NA' ... – Arun

+1

Le mie scuse. Stavo cercando di capire come etichettare i blocchi di codice. Ora è completamente modificato. – SeanM

+1

non utilizzare 'unione '. Usa 'lookup [DT]' invece (sintassi 'X [Y]'). Dovresti impostare entrambe le tabelle chiave per 'index1, index2' prima di farlo, ovviamente. – Arun

risposta

7

Dal momento che si desidera partecipare a index1 & index2, è possibile utilizzare merge come hai o se si assegna questi come chiavi per ciascuna delle tabelle, allora si può semplicemente utilizzare [] di aderire. (Come in DT[lookup])

setkey(lookup, index1, index2) 
setkey(DT, index1, index2) 

poi si può iterare su ognuna unica key dal vostro tavolo lookup come segue

keyVals <- unique(lookup[, key]) 

for (k in keyVals) 
    DT[lookup[key==k], c(k) := value] 



Risultati:

DT 
#  index1 index2 value a  b c 
# 1:  1  2 -5.00 NA -5.00 NA 
# 2:  1  2 -7.50 NA -7.50 NA 
# 3:  1  2 -8.75 NA -8.75 NA 
# 4:  2  0 0.00 NA NA NA 
# 5:  2  1 15.00 15.0 NA NA 
# 6:  2  1 12.50 12.5 NA NA 
# 7:  2  2 15.00 NA NA 15 
# 8:  3  2 -5.00 NA -5.00 NA 
# 9:  3  2 17.50 NA 17.50 NA 
# 10:  3  2 3.75 NA 3.75 NA 
+1

+1 'lookup [. (K)]' piuttosto che vector scan '==' forse. –

+0

'c (k)' è una bella sintassi LHS per evitare 'with = FALSE'. Non ci avevo pensato! –

+1

@ MD Grazie. Ho avuto l'idea di usare 'c (string1, string2)' per assegnazioni multiple in 'LHS' –

Problemi correlati