如何创建新列,其累计总和与现有列的累计总和相加?

问题描述 投票:0回答:1

使用 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()
,但我的大多数想法都需要迭代。

r dplyr tidyverse vectorization
1个回答
0
投票

也许答案有点混乱,但这是使用

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
© www.soinside.com 2019 - 2024. All rights reserved.