如果你正在尋找的速度和內存效率 - 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
由於阿倫在評論中指出的,還可以使用set
功能從data.table
包要做到這一點在data.frame
-place修改的還有:
for (i in seq_along(df))
set(df, j = i, value = df[[i]] * v[i])
這當然也適用於data.table
的,可能是顯著更快,如果列數很大。
爲什麼它需要一個data.frame?如果你有所有的數字元素,通常使用矩陣更有意義。 –