2013-08-29 21 views
50

Desidero utilizzare la funzione apply su un dataframe, ma solo applicare la funzione alle ultime 5 colonne.R Funzione Apply() su colonne specifiche del dataframe

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

Questo vale A per tutte le colonne di y

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

Ciò vale A solo alle colonne 4-9 di y, ma il rendimento totale del B spoglia prime 3 colonne ... Voglio ancora quelli, semplicemente non voglio che A si applichi a loro.

wifi[,1:3]+B 

inoltre non fa quello che mi aspettavo/voluto.

+1

La 'da' chiamata sta complicando questa domanda. Se è pertinente, è necessario riscrivere la domanda per chiarire (che cos'è il wifi $ Room?). Ho ignorato nella mia risposta qui sotto. – leif

+0

Si potrebbe 'cbind (y [1: 3], ...)' al risultato che si sta ottenendo. –

risposta

42

Utilizzando una funzione di esempio data.frame e l'esempio (solo +1 a tutti i valori)

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 

O anche:

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

C'è un modo per farlo usando '$' per indicizzare una certa colonna per nome invece di usare' [:] 'per indicizzare per numero di colonna? Ho provato ad aggiungere i nomi: 'colnames (wifi) = c (" a "," b "," c "," d "," e "," f "," g "," h "," i ")' ma qualsiasi tentativo di usare lapply (wifi $ e, 2, X) non stava accadendo. – skotturi

+5

@skotturi - puoi farlo come 'wifi [c (" a "," b "," c ")]' per indicizzare più colonne per nome. – thelatemail

47

lapply è probabilmente una scelta migliore di apply qui, che si applicano per prima cosa costruisci il tuo data.frame in un array, il che significa che tutte le colonne devono avere lo stesso tipo. A seconda del contesto, questo potrebbe avere conseguenze non volute.

Lo schema è:

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

Il vettore 'colli' può essere nomi o indici variabili. Preferisco usare i nomi quando possibile (è robusto per il riordino delle colonne). Quindi nel tuo caso questo potrebbe essere:

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

Un esempio di utilizzo nomi di colonne:

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

Una piccola correzione: wifi <- data.frame (A = 1: 4, B = runif (4), C = 5: 8) – jcfaria

Problemi correlati