2012-11-15 9 views
8

Mi piacerebbe imparare come applicare le funzioni su colonne specifiche del mio dataframe senza "escludere" le altre colonne dal mio df. Per esempio mi piacerebbe moltiplicare alcune colonne specifiche per 1000 e lasciare le altre come sono.R: Applicare la funzione su colonne specifiche preservando il resto del dataframe

Utilizzando la funzione sapply per esempio come questo:

a<-as.data.frame(sapply(table.xy[,1], function(x){x*1000})) 

ottengo nuovi dataframes con la prima colonna moltiplicato per 1000, ma senza le altre colonne che non ho usato nell'operazione. Quindi il mio tentativo è stato quello di fare in questo modo:

a<-as.data.frame(sapply(table.xy, function(x) if (colnames=="columnA") {x/1000} else {x})) 

ma questo non ha funzionato.

La mia soluzione alternativa era quella di dare a entrambi i dataframes un'altra riga con ID e in seguito unire il vecchio dataframe con quello appena creato per ottenerne uno completo. Ma penso che ci debba essere una soluzione migliore. Non è vero?

risposta

6

Se si desidera solo fare un calcolo su una o poche colonne è possibile utilizzare transform o semplicemente indice manualmente:

# with transfrom: 
df <- data.frame(A = 1:10, B = 1:10) 
df <- transform(df, A = A*1000) 

# Manually: 
df <- data.frame(A = 1:10, B = 1:10) 
df$A <- df$A * 1000 
+0

sì. questo era quello che stavo cercando. Grazie!! – Joschi

+0

come faccio questo se ho un sacco di colonne (n = 30)? digitare tutti i nomi sarebbe troppo lavoro ... – Joschi

+2

Hai i numeri? 'df [, c (1,2, ....)] <- 1000 * df [, c (1,2, ....)]' –

0

Il seguente codice si applica la funzione desiderata per i soli le colonne specificare. Creerò un semplice frame di dati come un esempio riproducibile.

(df <- data.frame(x = 1, y = 1:10, z=11:20)) 
(df <- cbind(df[1], apply(df[2:3],2, function(x){x*1000}))) 

In sostanza, utilizzare cbind() per selezionare le colonne che non si desidera la funzione per l'esecuzione su, quindi utilizzare apply() con funzioni desiderate sulle colonne di destinazione.