2013-04-25 17 views
6

Desidero modificare la classe delle variabili selezionate in una tabella di dati, utilizzando un'operazione vettoriale. Sono nuovo della sintassi data.table e sto cercando di imparare il più possibile. Ora la domanda è di base, ma mi aiuterà a capire meglio il modo di pensare della tabella dati!Riclassifica colonne selezionate nella tabella dati

Una domanda simile è stata posta here! Tuttavia, la soluzione sembra riguardare sia la riclassificazione di una sola colonna o di tutte le colonne. La mia domanda è unica per alcune colonne selezionate.

### Load package 
require(data.table) 

### Create pseudo data 
data <- data.table(id  = 1:10, 
        height = rnorm(10, mean = 182, sd = 20), 
        weight = rnorm(10, mean = 160, sd = 10), 
        color = rep(c('blue', 'gold'), times = 5)) 

### Reclass all columns 
data <- data[, lapply(.SD, as.character)] 

### Search for columns to be reclassed 
index <- grep('(id)|(height)|(weight)', names(data)) 

### data frame method 
df <- data.frame(data) 
df[, index] <- lapply(df[, index], as.numeric) 

### Failed attempt to reclass columns used the data.table method 
data <- data[, lapply(index, as.character), with = F] 

Qualsiasi aiuto sarebbe apprezzato. I miei dati sono grandi e quindi è necessario utilizzare espressioni regolari per creare un vettore di numeri di colonne da riclassificare.

Grazie per il vostro tempo.

risposta

8

penso che @ SimonO101 fatto la maggior parte del lavoro

data[, names(data)[index] := lapply(.SD, as.character) , .SDcols = index ] 

si può semplicemente utilizzare il := magia

+0

+1 questo è tutto !! Ok, dato che la mia risposta non è corretta, la cancellerò. –

+0

No, no, ho imparato quel trucco ('.SDCols') con te così ... – dickoa

+2

(+1) puoi anche passare direttamente 'index'. 'data [, c (indice): = lapply (.SD, as.character), .SDcols = index]' – Arun

4

Hai solo bisogno di utilizzare .SDcols con il vettore indice (ho imparato che oggi!), Ma che sarà solo restituire una tabella di dati con le colonne Reclassed. La risposta di @dickoa è ciò che stai cercando.

data <- data[, lapply(.SD, as.character) , .SDcols = index ] 
sapply(data , class) 
     id  height  weight 
"character" "character" "character" 
+0

Questo crea un nuova tabella dati con solo le colonne "indice". Come posso cambiare la classe delle colonne "indice" e mantenere intatto il resto del dato.table? Posso facilmente vedere come farlo usando un unione o cbind, ma ci deve essere un modo più elegante! – Andreas

+0

Argggh. Hai ragione. Lo so, ma ho anche problemi con la sintassi. C'è un modo semplice - cercando di ricordare la sintassi corretta !! –

+0

Questo è importante da notare. Grazie per aver modificato la tua risposta per riflettere ciò che abbiamo imparato! – Andreas

9

Si potrebbe evitare il sovraccarico della costruzione di .SD all'interno j utilizzando set

for(j in index) set(data, j =j ,value = as.character(data[[j]])) 
+2

(+1) Questo è veloce/efficiente su 2 account: 1) no. SD e 2) usando 'set' invece di': = '(l'ultimo dei quali ha l'overhead' [.data.table'). Brillante! – Arun

+2

@Arun, funzionerà anche su data.frames! – mnel

Problemi correlati