带复位的累积条件乘积

Posted

技术标签:

【中文标题】带复位的累积条件乘积【英文标题】:Cumulative conditional product with reset 【发布时间】: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)
)

我尝试过withifelsecumprod 的各种组合,例如:

df$crt <- with(df, ifelse(df$dd<0, cumprod(1+df$rt)-1, 0))

但是,这不会在 df$dd 中的 0 之后重置累积乘积,它只会写入 0 并在 df$dd 再次低于零时继续之前的 df$rt 累积。

我想我缺少某种类型的计数器来启动重置。请注意,我用来实现此功能的数据框很大。

【问题讨论】:

请显示预期输出。你需要df %&gt;% group_by(grp = cumsum(dd &lt; 0)) %&gt;% mutate(crt = cumprod(1 + rt)-1) 预期结果是 df$crt。该 dplyr 解决方案没有给出预期的结果。 是的,它在 dplyr 中工作。我没有提到我有一个 xts 对象。有没有办法在base r中做到这一点? 【参考方案1】:

通过取逻辑向量(dd == 0)的累积和来创建一个分组列,使其在 dd 为 0 的位置增加 1,然后使用 replace 和条件在 'rt' 中进行累积乘积仅在 'dd' 不等于 0 的地方

library(dplyr)
df %>% 
    group_by(grp = cumsum(dd ==  0)) %>% 
    mutate(crt1 = replace(dd, dd != 0, (cumprod(1 + rt[dd!=0]) - 1))) %>%
    ungroup %>%
    select(-grp)

-输出

# A tibble: 11 x 4
        rt      dd    crt   crt1
     <dbl>   <dbl>  <dbl>  <dbl>
 1  0       0      0      0     
 2  0.0171 -0.0657 0.171  0.0171
 3  0.0796 -0.0013 0.0981 0.0981
 4  0.003   0      0      0     
 5  0.0754 -0.018  0.0754 0.0754
 6 -0.0314 -0.0012 0.0415 0.0416
 7  0.0275  0      0      0     
 8 -0.0323  0      0      0     
 9  0.0364  0      0      0     
10  0.0473 -0.0016 0.473  0.0473
11 -0.0021 -0.0856 0.045  0.0451

或使用base R

with(df, ave(rt * (dd != 0), cumsum(dd == 0), FUN = function(x)
        replace(x, x != 0, (cumprod(1 + x[x != 0]) - 1))))

-输出

 [1] 0.00000000 0.01710000 0.09806116 0.00000000 0.07540000 0.04163244 0.00000000 0.00000000 0.00000000 0.04730000 0.04510067

【讨论】:

这很好用!是否还有可以与 xts 对象一起使用的非 dplyr 方法?在基数 r 中? 谢谢阿克伦!

以上是关于带复位的累积条件乘积的主要内容,如果未能解决你的问题,请参考以下文章

R(dplyr)中复位的条件运行计数(累计和)

复位电路

51 单片机定时器数码管 从1数到100(带三个按键控制开始,暂停,复位)

炸弹时间复位

verilog小程序——上电自动复位

Nightmare --- 炸弹时间复位