如果你正在寻找的速度和内存效率 - 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?如果你有所有的数字元素,通常使用矩阵更有意义。 –