gpt4 book ai didi

r - R 中的折扣累积和

转载 作者:行者123 更新时间:2023-12-04 11:10:55 26 4
gpt4 key购买 nike

我正在尝试计算一个折扣累积总和,其中后面的值更有值(value)。

假设我有以下数据集:

 dt <- data.table( "year" = c(79,80,81,82,83), "value" = c(5,2,6,8,9))  

> dt
year value
1: 79 5
2: 80 2
3: 81 6
4: 82 8
5: 83 9

我想要以下输出:
> dt2
year value DCS
1: 79 5 5.0000
2: 80 2 6.5000
3: 81 6 11.8500
4: 82 8 18.6650
5: 83 9 25.7985

贴现累积金额 (DCS) 是通过以 10% 的年贴现率贴现之前的值来计算的。因此,对于第一行和第二行,DCS 值由 2 + 5*(0.9)^1 给出。对于第三行,DCS 为 6 + (0.9)^1*2 + (0.9)^2*5,依此类推。

形式上,贴现总和公式由下式给出:

enter image description here

最后,如果可能,最好使用 data.table 解决方案。

最佳答案

这里有 2 个其他选项。

1) 使用 Rcpp然后在 data.table 中通过引用更新:

library(Rcpp)
cppFunction("
NumericVector dcs(NumericVector x, double disc) {
int n = x.size();
NumericVector res(n);
res[0] = x[0];
for (int i=1; i<n; i++) {
res[i] += x[i] + res[i-1]*disc;
}
return res;
}")
dt[, DCS := dcs(value, 0.9)]

2) 或者在 data.table 中递归:
s <- 0
dt[, dcs2 := {
s <- value + s*0.9
s
},
1L:nrow(dt)]

#or simply: s <- 0; dt[, dcs2 := s <- value + s*0.9, 1L:nrow(dt)]

输出:
   year value     DCS    dcs2
1: 79 5 5.0000 5.0000
2: 80 2 6.5000 6.5000
3: 81 6 11.8500 11.8500
4: 82 8 18.6650 18.6650
5: 83 9 25.7985 25.7985

编辑:回应关于分组的评论:
dt <- data.table(ID=c(1,1,2,2), value=1:4)
dt[, {
n <- .N
s <- 0;
.SD[, {
s <- value + s*0.9;
s
},
1L:n]
},
ID]

输出:
   ID n  V1
1: 1 1 1.0
2: 1 2 2.9
3: 2 1 3.0
4: 2 2 6.7

关于r - R 中的折扣累积和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61801850/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com