2013-05-28 10 views
28

Ich versuche, eine Funktion auf eine Gruppe von Spalten in einer großen data.table anzuwenden, ohne auf jede einzeln zu verweisen.R Datatable, wenden Sie eine Funktion auf eine Teilmenge von Spalten an

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') 

mit MWE oben, dies:

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

funktioniert, aber dies:

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

funktioniert nicht. Was ist der richtige Weg, um die as.numeric Funktion nur auf die Spalten 2 und 3 von a anzuwenden, ohne sie einzeln zu erwähnen.

(In dem aktuellen Datensatz gibt zig Spalten ist, so dass es unpraktisch wäre)

Dank

Antwort

40

Der idiomatische Ansatz ist die Verwendung .SD und .SDcols

Sie können die RHS zwingen zu sein in () in dem übergeordneten Rahmen von Verpackung bewertet

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

Für Spalten 2: 3

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

oder

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

Wenn Sie die Gruppierung der "von" zu verwenden, hier ist die im Voraus aufgenommen werden müssen, in 'mysubset'? –

+1

@TrevorAlexander - Nein, die By-Spalten befinden sich nicht in '.SD', sie existieren als einzelne Werte in der Umgebung, in der' .SD' erstellt wird. – mnel

+0

Hi wie benutze ich das, wenn ich die Funktion auf alle Spalten außer 'b' anwenden möchte? Vielen Dank! – Christa

Verwandte Themen