0

私は多くのことを試しましたが、このコードをベクトル化するのにかなり苦労しました。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
}

ありがとうございました!

4

2 に答える 2