【发布时间】:2021-09-12 21:27:32
【问题描述】:
我有一个很大的 xts 对象。但是,该示例位于数据的 data.frame 两列子集中。每当第二列 df$dd 小于 0 时,我想计算(在新列中)第一列 df$rt 的累积乘积。每当 df$dd 为 0 时,我想再次将累积重置为 0。因此,对于df$dd 小于 0 的下一个实例,df$rt 的累积乘积再次开始。
以下示例数据框将所需结果添加为第三列df$crt,以供参考。请注意,已应用了一些舍入。
df <- data.frame(
rt = c(0, 0.0171, 0.0796, 0.003, 0.0754, -0.0314, 0.0275, -0.0323, 0.0364, 0.0473, -0.0021),
dd = c(0, -0.0657, -0.0013, 0, -0.018, -0.0012, 0, 0, 0, -0.0016, -0.0856),
crt = c(0, 0.171, 0.0981, 0, 0.0754, 0.0415, 0, 0, 0, 0.473, 0.045)
)
我尝试过with、ifelse 和cumprod 的各种组合,例如:
df$crt <- with(df, ifelse(df$dd<0, cumprod(1+df$rt)-1, 0))
但是,这不会在 df$dd 中的 0 之后重置累积乘积,它只会写入 0 并在 df$dd 再次低于零时继续之前的 df$rt 累积。
我想我缺少某种类型的计数器来启动重置。请注意,我用来实现此功能的数据框很大。
【问题讨论】:
-
请显示预期输出。你需要
df %>% group_by(grp = cumsum(dd < 0)) %>% mutate(crt = cumprod(1 + rt)-1) -
预期结果是 df$crt。该 dplyr 解决方案没有给出预期的结果。
-
是的,它在 dplyr 中工作。我没有提到我有一个 xts 对象。有没有办法在base r中做到这一点?
标签: r dataframe finance xts cumulative-sum