2014-08-29 20 views
9

Sto cercando di utilizzare data.table per ricodificare una variabile in base a determinate condizioni. Il mio set di dati originale ha circa 30 milioni di record e dopo tutto la creazione di variabili attorno a 130 variabili. Ho usato i metodi suggeriti qui: conditional statements in data.table(M1) e anche qui data.table: Proper way to do create a conditional variable when column names are not known?(M2)Uso di istruzioni condizionali in r data.table

Il mio obiettivo è ottenere l'equivalente del codice qui sotto, ma qualcosa che è applicabile utilizzando data.table

samp$lf5 <- samp$loadfactor5 

samp$lf5 <- with(samp, ifelse(loadfactor5 < 0, 0, lf5)) 

Ammetto che non capisco .SD e .SDCols molto bene, quindi potrei usarlo male. Il codice ed errori da (M1) e (M2) sono riportati di seguito e il set di dati campione è qui: http://goo.gl/Jp97Wn

(M1)

samp[,lf5 = if(loadfactor5 <0) 0 else loadfactor5] 

messaggio di errore

Error in `[.data.table`(samp, , lf5 = if (loadfactor5 < 0) 0 else loadfactor5) : 
unused argument (lf5 = if (loadfactor5 < 0) 0 else loadfactor5) 

Quando si esegue questa operazione:

samp[,list(lf5 = if(loadfactor5 <0) 0 else loadfactor5)] 

dà lf5 come una lista, ma non come parte della SAMP data.table e in realtà non applicare la condizione di lf5 ha ancora valori inferiori a 0.

(M2)

Col1 <- "loadfactor5" 
Col2 <- "lf5" 

setkeyv(samp,Col1) 
samp[,(Col2) :=.SD,.SDCols = Col1][Col1<0,(Col2) := .SD, .SDcols = 0] 

ottengo il seguente errore

Error in `[.data.table`(samp, , `:=`((Col2), .SD), .SDCols = Col1) : 
unused argument (.SDCols = Col1) 

Eventuali approfondimenti su come finire questo apprezzato. Il mio set di dati ha 30 milioni di record, quindi spero di usare data.table per ridurre davvero i tempi di esecuzione.

Grazie,

Krishnan

+2

'samp [, lf5: = ifelse (loadfactor5 <0, 0, loadfactor5)]'; cerca '.SD' su SO per scoprire che cos'è/fa – eddi

+0

Sono stato in grado di usare questo comando per ottenere il risultato desiderato. – Krishnan

+0

@Krishnan, potresti rispondere tu stesso e accettarlo in modo che la Q rimanga risposta? Grazie. – Arun

risposta

17

risposta fornita da eddi e incluso qui per ragioni di completezza.

samp[, lf5 := ifelse(loadfactor5 < 0, 0, loadfactor5)]

+1

Immagino che il quid della domanda sia usare ": =" invece di "=".E potresti anche scrivere samp [, lf5: = loadfactor5 * (loadfactor> = 0)] – skan

2

Un altro modo (che io preferisco, perché è, a mio parere, più pulito):

samp[, lf5 := 0]; samp[loadfactor5 > 0, lf5 := loadfactor5]; 

Io uso data.table con un set di dati con 90M filari; Sono continuamente stupito di quanto velocemente data.table sia per operazioni come sopra.

+0

Ho un datatable con 12M righe e ho bisogno di modificare i campi e quando faccio dt [, TYPE: = ifelse (is.na (TYPE) == TRUE, "NONE", TYPE)] occorrono 7 secondi per la durata di dplyr. Può essere accelerato in qualche modo? – user3022875