Non sono convinto che nessuno di questi sia più veloce del metodo in due passaggi, semplicemente eseguendolo con un numero inferiore di tasti. Qui ci sono alcuni punti di riferimento:
library(microbenchmark)
microbenchmark(dplyr = {df<-data.frame(a=1:5,b=101:105,c=201:205);df<-transmute(df, a = log(a), b = b)},
transform = {df<-data.frame(a=1:5,b=101:105,c=201:205);df<-transform(df, a = log(a))},
within = {df<-data.frame(a=1:5,b=101:105,c=201:205);df<-within(df[1:2], a <- log(a))},
twosteps = {df<-data.frame(a=1:5,b=101:105,c=201:205);df<-df[,1:2];df[,1]<-log(df[,1])})
Unit: microseconds
expr min lq mean median uq max neval
dplyr 1374.710 1438.453 1657.3807 1534.0680 1658.2910 5231.572 100
transform 489.597 508.413 764.6921 524.9240 569.4680 18127.718 100
within 493.436 518.396 593.6254 534.9085 585.7880 1554.420 100
twosteps 421.245 438.909 501.6850 450.6210 491.5165 2101.231 100
Per dimostrare il commento di Gregor sotto, prima con 5 righe, ma mettendo la creazione di oggetti al di fuori del benchmark:
n = 5
df = data.frame(a = runif(n), b = rnorm(n), c = 1:n)
microbenchmark(dplyr = {df2 <- transmute(df, a = log(a), b = b)},
subset = {df2 <- `[`(transform(df, a = log(a)),1:2)},
within = {df2 <- within(df[1:2], a <- log(a))},
twosteps = {df2 <- df[,1:2]; df2[,1]<-log(df2[,1])})
# twosteps looks much better!
Ma se si aumenta il numero di righe da grande abbastanza dove potresti preoccuparti delle differenze di velocità:
n = 1e6
df = data.frame(a = runif(n), b = rnorm(n), c = 1:n)
microbenchmark(dplyr = {df2 <- transmute(df, a = log(a), b = b)},
subset = {df2 <- `[`(transform(df, a = log(a)),1:2)},
within = {df2 <- within(df[1:2], a <- log(a))},
twosteps = {df2 <- df[,1:2]; df2[,1]<-log(df2[,1])})
Le differenze vanno via.
il pacchetto 'dplyr' è buono per questo genere di cose. –
@JohnPaul il pacchetto data.table potrebbe anche essere un'alternativa goog, [vedi la mia risposta] (http://stackoverflow.com/a/31885840/2204410) per un'implementazione – Jaap