使用 tidyverse 函数,我希望创建一个新的数据列,其总和等于第一列中的累积和,但使用的增量不大于
incr
。
可以以 df 开头
> incr <- 1.5
> df <- data.frame(a = c(6,0,0,2.5,0,0))
> df
a
1 6.0
2 0.0
3 0.0
4 2.5
5 0.0
6 0.0
然后使用
b
:创建一个新列
incr
a b
1 6.0 1.5
2 0.0 1.5
3 0.0 1.5
4 2.5 1.5
5 0.0 1.5
6 0.0 1.0
我发现
tidyr::uncount()
,它似乎是一个可以工作的函数,但我需要使用非整数增量。一般来说,尝试改变和使用向量化函数,并考虑运行它rowwise()
,但我的大多数想法都需要迭代。
也许答案有点混乱,但这是使用
rowwise()
实现这一点的一种方法(添加一些 0 和一个很大的数字来测试它是否变为零然后再次开始计数):
library(dplyr)
incr <- 1.5
df <- data.frame(a = c(6,0,0,2.5,0,0,0,0,14,0))
df |>
mutate(
m = incr * row_number(),
d = cumsum(a),
e = d - lag(m, default = 0)
) |>
rowwise() |>
mutate(b = max(0, min(e, incr)))
#> # A tibble: 10 × 5
#> # Rowwise:
#> a m d e b
#> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 6 1.5 6 6 1.5
#> 2 0 3 6 4.5 1.5
#> 3 0 4.5 6 3 1.5
#> 4 2.5 6 8.5 4 1.5
#> 5 0 7.5 8.5 2.5 1.5
#> 6 0 9 8.5 1 1
#> 7 0 10.5 8.5 -0.5 0
#> 8 0 12 8.5 -2 0
#> 9 14 13.5 22.5 10.5 1.5
#> 10 0 15 22.5 9 1.5