好吧,除非您可以矢量化,否则没有快速循环替代方案。在某些情况下,像这样的函数ave, aggregate, ddply, tapply, ...
可以给你带来巨大的胜利,但诀窍通常在于使用更快的函数,比如 cumsum (参见 user615147 的答案)
为了显示 :
top <- 1000
tm <- rnorm(top,10)
time <- rnorm(top,10)
> system.time(
+ results <- sapply(2:top,function (k) coef(lm(tm[1:k] ~ log(time[1:k])))[2])
+ )
user system elapsed
4.26 0.00 4.27
> system.time(
+ results <- lapply(2:top,function (k) coef(lm(tm[1:k] ~ log(time[1:k])))[2])
+ )
user system elapsed
4.25 0.00 4.25
> system.time(
+ results <- for(k in 2:top) coef(lm(tm[1:k] ~ log(time[1:k])))[2]
+ )
user system elapsed
4.25 0.00 4.25
> system.time(
+ results <- for(k in 2:top) lm.fit(matrix(log(time[1:k]),ncol=1),
+ tm[1:k])$coefficients[2]
+ )
user system elapsed
0.43 0.00 0.42
唯一更快的解决方案是lm.fit()
. 不要误会,每次运行分析时时间都会有所不同,因此 0.02 的差异在 R 中并不显着,sapply, for
并且lapply
在这里都一样快。诀窍是使用lm.fit
.
如果您有一个名为 Data 的数据框,则可以使用以下内容:
Data <- data.frame(Y=rnorm(top),X1=rnorm(top),X2=rnorm(top))
mf <- model.matrix(Y~X1+X2,data=Data)
results <- sapply(2:top, function(k)
lm.fit(mf[1:k,],Data$Y[1:k])$coefficients[2]
)
作为更通用的解决方案。