r - 根据同一列中先前的值有条件地变异

标签 r dplyr

背景

我正在使用累积和实现变化检测方程。

问题

我想根据列中先前的值有条件地改变列。如果不满足条件,我想将值重置为0。

示例

library(dplyr)
library(tibble)

df_sample = as_tibble("x"=c(-15,95,-115,145,-55,15,-45,5,15)) %>% rowid_to_column("index")
df_sample = df_sample %>% 
  mutate(y = rep(0)) %>% 
  add_row(index=0, y=0,.before=1)

df_sample

#> # A tibble: 10 × 3
#>    index value     y
#>    <dbl> <dbl> <dbl>
#>  1     0    NA     0
#>  2     1   -15     0
#>  3     2    95     0
#>  4     3  -115     0
#>  5     4   145     0
#>  6     5   -55     0
#>  7     6    15     0
#>  8     7   -45     0
#>  9     8     5     0
#> 10     9    15     0

我尝试将 value 添加到之前的 y 列,并仅在求和结果正确时才将其保存在 y 列中大于 0,如果不是,则应将 y 列中的结果重置为 0。

df_sample %>% 
  mutate(y = if_else(value+lag(y) > 0, value+lag(y),0))
#> # A tibble: 10 × 3
#>    index value     y
#>    <dbl> <dbl> <dbl>
#>  1     0    NA    NA
#>  2     1   -15     0
#>  3     2    95    95
#>  4     3  -115     0
#>  5     4   145   145
#>  6     5   -55     0
#>  7     6    15    15
#>  8     7   -45     0
#>  9     8     5     5
#> 10     9    15    15

y 列中的预期值

#> # A tibble: 10 × 3
#>    index value     y
#>    <dbl> <dbl> <dbl>
#>  1     0    NA     0
#>  2     1   -15     0
#>  3     2    95     95
#>  4     3  -115     0
#>  5     4   145     145
#>  6     5   -55     90
#>  7     6    15     105
#>  8     7   -45     60
#>  9     8     5     65
#> 10     9    15     80

这与此类似 post但这种情况是有条件的,它不是一个 cumproduct。

最佳答案

使用accumulate(公式中,.x是列值的当前值,.y是累加值):

library(purrr)
df_sample %>% 
  mutate(y = accumulate(value[-1], .init = 0, ~ if_else(.x + .y > 0, .x + .y, 0)))
# A tibble: 10 × 3
   index value     y
   <dbl> <dbl> <dbl>
 1     0    NA     0
 2     1   -15     0
 3     2    95    95
 4     3  -115     0
 5     4   145   145
 6     5   -55    90
 7     6    15   105
 8     7   -45    60
 9     8     5    65
10     9    15    80

关于r - 根据同一列中先前的值有条件地变异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73691272/

相关文章:

regex - 删除 R 中第一个括号之外的文本

python - 如何在 Rmarkdown 文档中显示来自 Python 代码的几何对象?

r - 通过 modelplot() 的正/负值更改绘图颜色

r - 尝试使用投资组合分析进行优化时出错

r - 如何防止线延伸到整个图形

r - 在 tidyeval 框架中避免越界

r - 为什么子集会随着 dplyr 中的 tbl_df 发生变化?

r - 使用最大值改变 IF-Else 语句

r - 计算最高进先出交易

r - 使用 dplyr::tbl 引用 PostgreSQL(振幅分析)表失败