如何将base r中基于滞后的列转换转换为dplyr管道?

如何将base r中基于滞后的列转换转换为dplyr管道?,r,dplyr,tidyverse,R,Dplyr,Tidyverse,我有一段代码在翻译成dplyr管道时遇到了很多麻烦 给定以下数据帧: 库(tidyverse) tb#A tibble:6 x 3 #>时间危险0危险1 #> #> 1 7 0.0477 0.107 #> 2 8 0.0241 0.0559 #> 3 9 0.0927 0.197 #> 4 10 0.139 0.279 #> 5 11 0.161 0.314 #> 6 12 0

我有一段代码在翻译成dplyr管道时遇到了很多麻烦

给定以下数据帧:

库(tidyverse)
tb#A tibble:6 x 3
#>时间危险0危险1
#>           
#> 1     7   0.0477   0.107 
#> 2     8   0.0241   0.0559
#> 3     9   0.0927   0.197 
#> 4    10   0.139    0.279 
#> 5    11   0.161    0.314 
#> 6    12   0.235    0.424
我要执行以下例行程序:

tb$surv_0 17 0.0477 0.107 0.952 0.893
#> 2     8   0.0241   0.0559  0.929  0.843
#> 3     9   0.0927   0.197   0.843  0.677
#> 4    10   0.139    0.279   0.726  0.488
#> 5    11   0.161    0.314   0.609  0.335
#> 6    12   0.235    0.424   0.466  0.193
surv_0
surv_1
的例程相同


由(v0.3.0)于2019-12-04创建的cumprod是您正在寻找的功能

tb %>% mutate(surv_0 = cumprod(1 - hazard_0), surv_1 = cumprod(1 - hazard_1))

请注意,这取决于数据的顺序是否正确。

在这种情况下,您绝对应该使用
cumprod
,因为它会更快更干净。在更一般的情况下,如果对象值不太清楚地依赖于以前的迭代,并且无法通过累积函数的组合获得正确的输出,则始终可以在函数中包装逻辑以在管道中使用它。您可以将一个非常简单的循环与
累计
一起使用,也可以花最少的时间翻译现有循环并将其放入函数中

库(tidyverse)
tb 28 0.0241 0.0559 0.929 0.929
#> 3     9   0.0927   0.197     0.843    0.843
#> 4    10   0.139    0.279     0.726    0.726
#> 5    11   0.161    0.314     0.609    0.609
#> 6    12   0.235    0.424     0.466    0.466
由(v0.3.0)于2019-12-04创建