2013-08-29 11 views
50

Chcę użyć funkcji stosowania na ramce danych, ale stosuję tę funkcję tylko w ostatnich 5 kolumnach.R Zastosuj() funkcja na konkretnych kolumnach kolumny danych

B<- by(wifi,(wifi$Room),FUN=function(y){apply(y, 2, A)}) 

Dotyczy to na wszystkich kolumnach y

B<- by(wifi,(wifi$Room),FUN=function(y){apply(y[4:9], 2, A)}) 

ten stosuje się tylko do kolumn 4-9 y, ale całkowity powrót B Odcina pierwsze 3 kolumny ... Nadal tego chcę, po prostu nie chcę, żeby A się do nich stosował.

wifi[,1:3]+B 

również nie robi tego, czego oczekiwałem/chciałem.

+1

The „przez” wezwanie komplikuje to pytanie. Jeśli jest to istotne, powinieneś przepisać pytanie, aby wyjaśnić (czym jest wifi $ Room?). Zignorowałem w mojej odpowiedzi poniżej. – leif

+0

Możesz "cinduj (y [1: 3], ...)" do wyniku, który otrzymujesz. –

Odpowiedz

42

Korzystanie z funkcji przykład data.frame i przykład (tylko +1 do wszystkich wartości)

A <- function(x) x + 1 
wifi <- data.frame(replicate(9,1:4)) 
wifi 

# X1 X2 X3 X4 X5 X6 X7 X8 X9 
#1 1 1 1 1 1 1 1 1 1 
#2 2 2 2 2 2 2 2 2 2 
#3 3 3 3 3 3 3 3 3 3 
#4 4 4 4 4 4 4 4 4 4 

data.frame(wifi[1:3], apply(wifi[4:9],2, A)) 
#or 
cbind(wifi[1:3], apply(wifi[4:9],2, A)) 

# X1 X2 X3 X4 X5 X6 X7 X8 X9 
#1 1 1 1 2 2 2 2 2 2 
#2 2 2 2 3 3 3 3 3 3 
#3 3 3 3 4 4 4 4 4 4 
#4 4 4 4 5 5 5 5 5 5 

lub nawet:

data.frame(wifi[1:3], lapply(wifi[4:9], A)) 
#or 
cbind(wifi[1:3], lapply(wifi[4:9], A)) 

# X1 X2 X3 X4 X5 X6 X7 X8 X9 
#1 1 1 1 2 2 2 2 2 2 
#2 2 2 2 3 3 3 3 3 3 
#3 3 3 3 4 4 4 4 4 4 
#4 4 4 4 5 5 5 5 5 5 
+0

Czy istnieje sposób, aby to zrobić, używając '$' do indeksowania pewnej kolumny według nazwy zamiast używania '[:]' do indeksowania według numeru kolumny? Próbowałem dodać colnames: colnames (wifi) = c ("a", "b", "c", "d", "e", "f", "g", "h", "i") ' ale żadna próba użycia lapply (wifi $ e, 2, X) nie nastąpiła. – skotturi

+5

@skotturi - możesz to zrobić jak 'wifi [c (" a "," b "," c ")]', aby indeksować wiele kolumn według nazwy. – thelatemail

47

lapply jest chyba lepszym wyborem niż apply tutaj, jak zastosować najpierw wymusza na twoją tablicę data.frame, co oznacza, że ​​wszystkie kolumny muszą mieć ten sam typ. W zależności od kontekstu może to mieć niezamierzone konsekwencje.

Wzór jest:

df[cols] <- lapply(df[cols], FUN) 

Wektor 'cols' mogą być nazwami zmiennych lub indeksów. Wolę używać nazw, jeśli tylko jest to możliwe (jest odporny na zmianę kolejności kolumn). Więc w twoim przypadku może to być:

wifi[4:9] <- lapply(wifi[4:9], A) 

przykład używania nazwy kolumn:

wifi <- data.frame(A=1:4, B=runif(4), C=5:9) 
wifi[c("B", "C")] <- lapply(wifi[c("B", "C")], function(x) -1 * x) 
+2

Mała korekta: wifi <- data.frame (A = 1: 4, B = runif (4), C = 5: 8) – jcfaria

Powiązane problemy