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]
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
Le mie scuse. Stavo cercando di capire come etichettare i blocchi di codice. Ora è completamente modificato. – SeanM
non utilizzare 'unione '. Usa 'lookup [DT]' invece (sintassi 'X [Y]'). Dovresti impostare entrambe le tabelle chiave per 'index1, index2' prima di farlo, ovviamente. – Arun