我已经尝试了很多东西,但在矢量化这段代码时遇到了很多麻烦。我已经设法找到了一种使用 lapply 执行此操作的方法,但它比下面的代码稍慢。请注意,数据按行数增加的err
位置排序。err
mySlowFunction <- function(data, vectorizedFunc){
#data is a data.frame
#vectorizedFunc is a function
n <- d <- array(0, dim = c(nrow(data),1))
for (i in 1:nrow(data)){
err.i <- data$err[i]
wt <- vectorizedFunc(data$X[i:nrow(data)] + err.i)
n[i] <- sum(data$Y[i:nrow(data)] / wt)
d[i] <- sum(1 / wt)
}
data$N.wt <- n
data$D.wt <- d
data
}
data <- data.frame(X = rnorm(10000), Y = rnorm(10000), err = rnorm(10000))
data <- data[order(data$err),]
system.time(mySlowFunction(data, exp))
我稍慢的 lapply 版本:
myEvenSlowerFunction <- function(data, vectorizedFunc){
#data is a data.frame
res <- unlist(lapply(data$err, function(x) {
idx <- which(data$err >= x)
wt <- vectorizedFunc(data$X[idx] + x)
c(sum(data$Y[idx] / wt), sum(1 / wt))
}))
idx <- seq(1,length(res) - 1,by=2)
data$N.wt <- res[idx]
data$D.wt <- res[idx + 1]
data
}
谢谢!