r-如何根据索引值求和指数衰减率



我需要计算一个常数的和,该常数是基于一个指数的幂。例如,如果我的常数是速率.5,而索引是4,我想求和.5^1+.5^2+.5^3+.5^4,并将此和分配给对象。因此,我的功能将启动以下内容:

 decay_rate = .5
index_value = 5
 expsum<-function(decay_rate, index_value) { 
decayVector <-rep(decay_rate,index_value)
indexp <-seq(1,index_value)
}

"我想把decayvector和indexp像sumproduct一样组合在一起,除了decayvector值是指数如果有一种方法可以用Plyer或sapply等来创建这个…那就太好了。

decay_rate = .5
index_value = 5
decind = function(rate, index){
    iv = 1:index
    sum(rate^iv)
}
decind(decay_rate, index_value)
[1] 0.96875

或者更短,无需申请或其他任何东西:

sum(decay_rate^(1:index_value))

这是一个可以使用简单矢量化解决方案的问题。这里不建议使用循环(或者sapply),因为它的工作速度相对较慢:

> decay_rate = .5
> index_value = 50000

这里有一个矢量化的解决方案:

> system.time(sum(decay_rate^(1:index_value)))
   user  system elapsed 
  0.005   0.000   0.006 

这里有一个巧妙(循环)类型的解决方案:

> system.time(sum(sapply(1:index_value, function(x) decay_rate^x)))
   user  system elapsed 
  0.112   0.009   0.139 

这里有一个sapply方法,尽管正如user14382所指出的,这个问题不需要循环。

> decay <- 0.5 
> index <- 5
> sum(sapply(1:index, function(x) decay^x))
## [1] 0.96875

如果你想让一个功能快速做到这一点,你可以简单地将你的功能调整为

> expsum <- function(decay, index){
      sum(decay^seq(index))
  }

然后你可以在单一衰减率上使用它,单一指数作为

> expsum(0.5, 5)
## [1] 0.96875
> expsum(0.9, 4)
## [1] 3.0951

或者用mapply 循环多次衰变和指数

> mapply(expsum, decay = c(0.5, 0.9), index = c(5, 4))
## [1] 0.96875 3.09510

最新更新