我正在嘗試在資料框中計算一個新列,該列將一個常數乘以前一行的值(在新創建的 B 列中)并累積結果。
為了澄清,這里是我的原始資料的一個例子:
A
---
100
200
300
400
500
這是我想要完成的事情:
A B
-----------
100 100.00
200 302.00
300 608.04
400 1020.20
500 1540.60
(The constant being in this case: 0.02)
我在 excel 中使用的(近似)公式與此類似:
=(B1*(1 constant) A2) [In Cell B2]
我已經嘗試使用 dplyr 的 lag、mutate 和 cumsum 來實作這一點,但到目前為止我還沒有運氣。這是迄今為止我設法實作的可復制示例:
rate = .02
A <- c(100,200,300,400,500)
df <- data.frame(A)
df = df %>%
mutate(B = lag(A,default=0)*(1 rate)) %>%
mutate(B = cumsum(B) df$A)
這會產生以下輸出(與我想要得到的不同):
A B
100 100.00
200 302.00
300 606.00
400 1012.00
500 1520.00
誰能幫我用一些代碼來計算這個?謝謝您的幫助!
uj5u.com熱心網友回復:
我們可以用 accumulate
library(dplyr)
library(purrr)
df %>%
mutate(B = accumulate(A, ~ .x*(1 rate) .y))
-輸出
A B
1 100 100.000
2 200 302.000
3 300 608.040
4 400 1020.201
5 500 1540.605
或在同一選項base R使用Reduce
Reduce(function(.x, .y) .x * (1 rate) .y, df$A, accumulate = TRUE)
[1] 100.000 302.000 608.040 1020.201 1540.605
uj5u.com熱心網友回復:
這是一種使用遞回函式的方法:
f = function(x) if (x == 1) 100 else 100 * x (1 rate) * f(x - 1)
res <- c()
for(i in 1:5) res <- c(res, f(i))
df %>%
mutate(B = res)
A B
1 100 100.000
2 200 302.000
3 300 608.040
4 400 1020.201
5 500 1540.605
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/404927.html
標籤:
上一篇:在R中四舍五入時間運算式
下一篇:基于映射到值向量的合并列值
