2013-05-28 14 views
28

Sto provando ad applicare una funzione a un gruppo di colonne in un data.table di grandi dimensioni senza fare riferimento a ciascuna di esse individualmente.R Datatable, applica una funzione a un sottoinsieme di colonne

a <- data.table(
    a=as.character(rnorm(5)), 
    b=as.character(rnorm(5)), 
    c=as.character(rnorm(5)), 
    d=as.character(rnorm(5)) 
) 
b <- c('a','b','c','d') 

con la MWE sopra, questo:

a[,b=as.numeric(b),with=F] 

opere, ma questo:

a[,b[2:3]:=data.table(as.numeric(b[2:3])),with=F] 

non funziona. Qual è il modo corretto di applicare la funzione as.numeric alle sole colonne 2 e 3 di a senza farvi riferimento singolarmente.

(Nei dati effettivi quivi sono decine di colonne in modo da rendere non praticabile)

Grazie

risposta

40

L'approccio idiomatica è usare .SD e .SDcols

È possibile forzare il RHS essere valutata nel frame principale da incarto ()

a[, (b) := lapply(.SD, as.numeric), .SDcols = b] 

Per le colonne 2: 3

a[, 2:3 := lapply(.SD, as.numeric), .SDcols = 2:3] 

o

mysubset <- 2:3 
a[, (mysubset) := lapply(.SD, as.numeric), .SDcols = mysubset] 
+0

Se si desidera utilizzare il "con" raggruppando qui, non che devono essere inclusi in anticipo, in 'mysubset'? –

+1

@TrevorAlexander - No, le colonne By non sono in '.SD', esistono come valori singoli nell'ambiente in cui' .SD' è stato creato. – mnel

+0

Ciao come lo uso se voglio applicare la funzione su tutte le colonne ma 'b'? Grazie! – Christa

Problemi correlati