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

时间:2014-04-27 02:55:26

标签: r sum plyr exponent

我需要根据索引计算一个常数加到一个幂的总和。例如,如果我的常量是速率.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值将是exponents 如果有一种方法可以使用Plyr或sapply等来创建它......这将是很棒的。

3 个答案:

答案 0 :(得分:2)

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))

答案 1 :(得分:0)

这是一个sapply方法,尽管如用户14332所指出的那样,此问题不需要循环。

> 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

答案 2 :(得分:0)

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

> decay_rate = .5
> index_value = 50000

这是一个矢量化解决方案:

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

这是一个sapply(循环)类型的解决方案:

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