2013-07-03 9 views
5

Ho un frame di dati e voglio trasformare tutte le colonne (ad esempio, prendere i log o qualsiasi altra cosa) con colonne che corrispondono a un certo nome. Quindi nell'esempio seguente, voglio prendere il log di X.1 e X.2, ma non Y o Z.1.Trasformare in modo efficiente più colonne di un frame di dati

df <- data.frame(
    Y = sample(0:1, 10, replace = TRUE), 
    X.1 = sample(1:10), 
    X.2 = sample(1:10), 
    Z.1 = sample(151:160) 
) 

# option 1, won't work for dozens of fields 
df$X.1 <- log(df$X.1) 
df$X.2 <- log(df$X.2) 

Esiste un modo valido ed efficace per eseguire questa operazione quando il dataframe è di diversi gigabty?

risposta

18

Nel caso di funzioni che restituirà un data.frame:

cols <- c("X.1","X.2") 
df[cols] <- log(df[cols]) 

caso contrario, sarà necessario utilizzare lapply o un anello sopra le colonne. Queste soluzioni saranno più lente della soluzione sopra, quindi usale solo se necessario.

df[cols] <- lapply(df[cols], function(x) c(NA,diff(x))) 
for(col in cols) { 
    df[col] <- c(NA,diff(df[col])) 
} 
+0

Il primo metodo sembra ottimo per le chiamate di cui ho bisogno in questo momento, grazie. Così ovvio, non sono sicuro del perché non ci ho pensato. – chmullig

6
vars <- c("X.1", "X.2") 

df[vars] <- lapply(df[vars], log) 
+0

Questo ha funzionato per me quando cercavo di applicare as.integer a un frame di dati quando la soluzione accettata no. – sage88

0
df <- data.frame(
Y = sample(0:1, 10, replace = TRUE), 
X.1 = sample(1:10), 
X.2 = sample(1:10), 
Z.1 = sample(151:160) 
) 
df 

supponendo che si sa quelle variabili che richiede conversioni nel vero dataframe (2 e 3 si riferisce al 2 ° e 3 ° variabili in df che sono X.1 e X.2)

df2=log10(df[c(2:3)]) 
df2 

se le variabili sono di gran lunga parte nel dataframe è possibile selezionarle come c (1,3,6,8: 10,13) per 1a, 3a, 6a 8a 10a e 13a.questa funziona solo per variabili numeriche .

Problemi correlati