2015-02-26 2 views
-1

Я хочу сделать что-то обычное в Excel, но я не знаю, как сделать это с R:Накопительное продукт с г

10  * 1.01 = 10.1 
(10+10.1) * 1.02 = 20.502 
(10+20.5) * 1.03 = ... 

Это как cumprod но * от внешнего вектора.

Edit:

У меня есть два вектора один может быть: с (50, 52, 54, 55), а другой с (1,01, 1,02, 1,03, 1,04), и я хочу сделать:

50 * 1.01 = 50.5 
(50.5 + 52) * 1.02 = 104.55 
... 

Я хочу получить вектор на каждом шагу без "для".

Thanks

+3

Не совсем понятно, что вы пытаетесь сделать. Можете ли вы предоставить некоторые примеры векторов? Кроме того, какую функцию вы используете для Excel? –

+1

Вы хотите, чтобы ваш результат был вектором, который показывает результат на каждом шаге или только конечный номер? –

+0

делает это до бесконечности? – Metrics

ответ

1

Как насчет использования следующего цикла?

v <- rep(NA, 3) 
for(i in 1:length(v)){ 
    v[i] <- (max(v[i-1], 0) + 10)*(1 + i/100) 
} 
v 
[1] 10.10000 20.50200 31.41706 
0

Если вы просто хотите, чтобы конечный продукт можно создать функцию:

## Create equal length vectors 
x <- rep(10, 10) 
y <- seq(1.01, 1.1, .01) 

## Create function 
accumProd <- function(x, y){ 
    z = 0 
    for (i in 1:length(x)){ 
    z <- (x[i]+z) * y[i] 
    } 
    z 
} 

accumProd(x,y) 
[1] 146.3286 
+0

Спасибо, но я хочу это на каждом шагу. –

5

Попробуйте

x <- 1 + 1:100/100 
f <- function(i) 10*sum(cumprod(x[i:1])) 
# first 10 elements 
sapply(1:10, f) 
# [1] 10.10000 20.50200 31.41706 43.07374 55.72743 69.67108 85.24805 
# [8] 102.86789 123.02601 146.32861 

Ответ на отредактированной вопрос: только адаптацию выше.

a <- c(50, 52, 54, 55) 
b <- c(1.01, 1.02, 1.03, 1.04) 
f1 <- function(i)sum((a[i:1])*cumprod(b[i:1])) 
sapply(1:4, f1) 
#[1] 50.5000 104.5500 163.3065 227.0388 
+0

Что вы подразумеваете под * Vectorize * в этом контексте? –

+0

Я использовал Vectorize как эвфемизм для «не использовать циклы». Разве это не векторизация? – Khashaa

+0

'sapply' - это цикл, написанный в R, в отличие от цикла * Vectorized *, который написан на C/C++ (например,' rowSums'), поэтому не уверен, что вы подразумеваете под этим. Хотя я не критикую ваш подход, просто хотел понять, что вы имели в виду. R-петли тоже прекрасны, они просто не попадают под категорию * Векторизованный *. –

Смежные вопросы