私は多くのことを試しましたが、このコードをベクトル化するのにかなり苦労しました。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))
私の少し遅いラップバージョン:
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
}
ありがとうございました!