我需要计算一个常数的和,该常数是基于一个指数的幂。例如,如果我的常数是速率.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