あなたはスピードとメモリ効率を探している場合 - 救助にdata.table
:
library(data.table)
dt = data.table(df)
for (i in seq_along(dt))
dt[, i := dt[[i]] * v[i], with = F]
eddi = function(dt) { for (i in seq_along(dt)) dt[, i := dt[[i]] * v[i], with = F] }
arun = function(df) { df * matrix(v, ncol=ncol(df), nrow=nrow(df), byrow=TRUE) }
nograpes = function(df) { data.frame(mapply(`*`,df,v,SIMPLIFY=FALSE)) }
N = 1e6
dt = data.table(A = rnorm(N), B = rnorm(N))
v = c(0,2)
microbenchmark(eddi(copy(dt)), arun(copy(dt)), nograpes(copy(dt)), times = 10)
#Unit: milliseconds
# expr min lq median uq max neval
# eddi(copy(dt)) 17.46796 19.23358 23.53997 26.03665 30.
# arun(copy(dt)) 1014.36108 1375.66253 1461.46489 1527.66639 1721.96316 10
# nograpes(copy(dt)) 92.14517 109.30627 158.42780 186.32240 188.01758 10
アルンはコメントで指摘したように、一もこの中に操作を行うためにdata.table
パッケージからset
機能を使用することができますdata.frame
のインプレース修正:s「は、同様のコースの
for (i in seq_along(df))
set(df, j = i, value = df[[i]] * v[i])
これもdata.table
のために働く」の数と列数が多い場合に大幅に高速である可能性があります。
なぜそれがdata.frameする必要がありますか。すべての数値要素がある場合は、一般に行列を使用する方が理にかなっています。 –