2014-04-27 4 views
0

인덱스를 기반으로 한 힘으로 증가 된 상수의 합을 계산해야합니다. 예를 들어, 내 상수가 .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) 
} 

"나는 등이 사용 Plyr 또는 sapply을 만들 수있는 방법이 있다면 지수 것 decayVector 값을 제외하고 SUMPRODUCT처럼 decayvector 및 indexp을 결합 추측 ... 있음 : 그래서 내 기능은 다음 시작할 것 좋은 것

+0

합 '(0.5 ** (1 : 5))'또는'expsum <- 함수 (x, y)의 합 (X ** (1 : 예))' – rawr

답변

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

(+1) 루프가 필요 없다는 것을 지적하기 위해. –

+0

R. user14382 솔루션에서 프로그래밍하는 법을 배우는 중대한 도움이 가장 효율적이지만 Scriven이 제공 한 설명에 정말 감사드립니다. 이유를 이해하는 데 도움이됩니까? – RayR

0

는입니다방법이지만, user14382가 지적했듯이이 문제에는 루핑이 필요하지 않습니다. 이 기능은 신속하게이 작업을 수행하려면

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

, 당신은 단순히 그런 다음

> expsum(0.5, 5) 
## [1] 0.96875 
> expsum(0.9, 4) 
## [1] 3.0951 
같은 단일 붕괴 속도, 단일 인덱스에 사용할 수 있습니다

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

에 기능을 조정할 수 있습니다

또는 루프를 여러 번 감쇠하고 인덱스를 mapply

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

이 문제는 간단한 벡터화 된 솔루션을 사용할 수있는 경우에 발생합니다. 이 비교적 천천히 작동하기 때문에 (그 문제에 관해서, sapply 또는) 루프를 사용하여, 여기에 사용하지 않는 것이 좋습니다 : 여기

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

는 sapply (루프)입니다 : 여기
> decay_rate = .5 
> index_value = 50000 

은 벡터화 된 솔루션입니다 타입 용액 :

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