2013-05-28 17 views
28

Próbuję zastosować funkcję do grupy kolumn w dużej tabeli danych bez odwoływania się do każdego z nich osobno.R Dataable, zastosowanie funkcji do podzbioru kolumn

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

z MWE powyżej, to:

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

prace, ale w ten sposób:

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

nie działa. Jaki jest prawidłowy sposób zastosowania funkcji as.numeric tylko do kolumn 2 i 3 z a bez odwoływania się do nich indywidualnie.

(W rzeczywistych danych ustawione są dziesiątki kolumn więc byłoby niepraktyczne)

Dzięki

Odpowiedz

40

idiomatyczne podejściem jest użycie .SD i .SDcols

Można wymusić RHS być oceniano w ramki nadrzędnej przez owinięcie ()

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

przypadku kolumn 2: 3

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

lub

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

Jeśli chcesz użyć "przez" grupowanie tutaj, to ma być zawarte z wyprzedzeniem, w 'mysubset'? –

+1

@TrevorAlexander - Nie, kolumny "By" nie znajdują się w '.SD', istnieją jako pojedyncze wartości w środowisku, w którym' .SD' jest tworzone. – mnel

+0

Witam, jak używać tego, jeśli chcę zastosować funkcję we wszystkich kolumnach, ale "b"? Dzięki! – Christa

Powiązane problemy