背景
我正在使用累积和实现变化检测方程。
问题
我想根据列中先前的值有条件地改变列。如果不满足条件,我想将值重置为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/