2015-04-07 14 views
8

Il set di dati di seguito presenta le caratteristiche del mio set di dati di grandi dimensioni. Sto gestirlo in data.table, alcune colonne vengono caricati come chr nonostante sono numeri e voglio convertirli in valori numerici e questi nomi di colonna sono notiCome convertire il carattere in numerico all'interno di data.table per colonne specifiche?

dt = data.table(A=LETTERS[1:10],B=letters[1:10],C=as.character(runif(10)),D = as.character(runif(10))) # simplified version 
strTmp = c('C','D') # Name of columns to be converted to numeric 

# columns converted to numeric and returned a 10 x 2 data.table 
dt.out1 <- dt[,lapply(.SD, as.numeric, na.rm = T), .SDcols = strTmp] 

sono in grado di convertire quei 2 colonne a numerico con il codice sopra tuttavia voglio invece aggiornare dt. Ho provato a usare: = tuttavia non ha funzionato. Ho bisogno di aiuto qui!

dt.out2 <- dt[, strTmp:=lapply(.SD, as.numeric, na.rm = T), .SDcols = strTmp] # returned a 10 x 6 data.table (2 columns extra) 

Ho anche provato il codice qui sotto (codificato come un data.frame - non la mia soluzione ideale, anche se funziona come io sono preoccupato, in alcuni casi, l'ordine potrebbe cambiare), ma ancora non funziona. Qualcuno può farmi sapere perché non funziona, per favore?

dt[,strTmp,with=F] <- dt[,lapply(.SD, as.numeric, na.rm = T), .SDcols = strTmp] 

Grazie in anticipo!

risposta

7

Mentre la risposta di Roland è più idiomatica, si può anche considerare set all'interno di un ciclo di qualcosa di più diretto questo. Un approccio potrebbe essere qualcosa di simile:

strTmp = c('C','D') 
ind <- match(strTmp, names(dt)) 

for (i in seq_along(ind)) { 
    set(dt, NULL, ind[i], as.numeric(dt[[ind[i]]])) 
} 

str(dt) 
# Classes ‘data.table’ and 'data.frame': 10 obs. of 4 variables: 
# $ A: chr "A" "B" "C" "D" ... 
# $ B: chr "a" "b" "c" "d" ... 
# $ C: num 0.308 0.564 0.255 0.828 0.128 ... 
# $ D: num 0.635 0.0485 0.6281 0.4793 0.7 ... 
# - attr(*, ".internal.selfref")=<externalptr> 

Dalla pagina di aiuto a ?set, questo sarebbe evitare alcuni dei [.data.table testa se che diventa sempre un problema per voi.

+0

Perché si usa NULL? – skan

+0

@skan, consultare i documenti per 'set'. Il 'NULL' rappresenta l'applicazione a tutte le righe. – A5C1D2H2I1M1N2O1R2T1

25
  1. Non è necessario assegnare l'intero data.table se si assegna per riferimento con := (vale a dire, non è necessario dt.out2 <-).

  2. È necessario avvolgere l'LHS di := tra parentesi per accertarsi che sia valutato (e non utilizzato come nome).

Ti piace questa:

dt[, (strTmp) := lapply(.SD, as.numeric), .SDcols = strTmp] 
str(dt) 
#Classes ‘data.table’ and 'data.frame': 10 obs. of 4 variables: 
# $ A: chr "A" "B" "C" "D" ... 
# $ B: chr "a" "b" "c" "d" ... 
# $ C: num 0.30204 0.00269 0.46774 0.08641 0.02011 ... 
# $ D: num 0.151 0.0216 0.5689 0.3536 0.26 ... 
# - attr(*, ".internal.selfref")=<externalptr> 
+0

Grazie mille !! – Lafayette

+0

Questo dovrebbe essere accettato come 'migliore risposta' imo – rolyat

Problemi correlati