R中的条件累积和

n9vozmp4  于 2023-09-27  发布在  其他
关注(0)|答案(2)|浏览(117)

我正试图添加一列到我的df,将有条件地按组求和列。当margin列中的值为负值时,它可以正常工作。但是,当该值为正时,我需要将和从加法改为减法。
我的df:

df <- data.frame(
  group = c('g1', 'g1', 'g1', 'g1', 'g1', 'g2', 'g2', 'g2', 'g2', 'g2', 'g2', 'g2', 'g2'),
  margin = c(-1.72, -1.13, -0.64, 1.75, 1.75, -7.22, -1.99, -1.13, -0.15, 1.31, 1.37, 1.98, 5.84) )

输出量:

group margin
1     g1  -1.72
2     g1  -1.13
3     g1  -0.64
4     g1   1.75
5     g1   1.75
6     g2  -7.22
7     g2  -1.99
8     g2  -1.13
9     g2  -0.15
10    g2   1.31
11    g2   1.37
12    g2   1.98
13    g2   5.84

预期输出:

df <- data.frame(
  group = c('g1', 'g1', 'g1', 'g1', 'g1', 'g2', 'g2', 'g2', 'g2', 'g2', 'g2', 'g2', 'g2'),
  margin = c(-1.72, -1.13, -0.64, 1.75, 1.75, -7.22, -1.99, -1.13, -0.15, 1.31, 1.37, 1.98, 5.84),
  exp_output = c(-1.72, -2.86, -3.50, -5.25, -7.00, -7.22, -9.22, -10.36, -10.51, -11.82, -13.20, -15.19, -21.03) )

   group margin exp_output
1     g1  -1.72      -1.72
2     g1  -1.13      -2.86
3     g1  -0.64      -3.50
4     g1   1.75      -5.25
5     g1   1.75      -7.00
6     g2  -7.22      -7.22
7     g2  -1.99      -9.22
8     g2  -1.13     -10.36
9     g2  -0.15     -10.51
10    g2   1.31     -11.82
11    g2   1.37     -13.20
12    g2   1.98     -15.19
13    g2   5.84     -21.03

因此,在第2行中,您可以看到,当margin值为负值时,计算结果为-1.72(第1行margin+第2行margin),依此类推。但是当第4行(1.75)发生变化时,它应该是-3.50(第4行)-1.75。
如何做到这一点?我只知道如何像这样做累计和:

df <- df %>%
  group_by(group) %>%
  mutate(exp_output = cumsum(margin)
sz81bmfz

sz81bmfz1#

因为你想减去正值,然后加上正值,这和想得到数字的负绝对值是一样的。使用dplyr最直接的方法是:

dplyr::mutate(df, out = -cumsum(abs(margin)), .by = group)

或者用碱基R:

df <- transform(df, exp_output = ave(-abs(margin), group, FUN = cumsum))

输出量:

group margin    out
1     g1  -1.72  -1.72
2     g1  -1.13  -2.85
3     g1  -0.64  -3.49
4     g1   1.75  -5.24
5     g1   1.75  -6.99
6     g2  -7.22  -7.22
7     g2  -1.99  -9.21
8     g2  -1.13 -10.34
9     g2  -0.15 -10.49
10    g2   1.31 -11.80
11    g2   1.37 -13.17
12    g2   1.98 -15.15
13    g2   5.84 -20.99
ltqd579y

ltqd579y2#

可以计算负绝对值的累计和:

library(dplyr, warn = FALSE)

df %>%
  group_by(group) %>%
  mutate(exp_output = cumsum(-abs(margin)))
#> # A tibble: 13 × 3
#> # Groups:   group [2]
#>    group margin exp_output
#>    <chr>  <dbl>      <dbl>
#>  1 g1     -1.72      -1.72
#>  2 g1     -1.13      -2.85
#>  3 g1     -0.64      -3.49
#>  4 g1      1.75      -5.24
#>  5 g1      1.75      -6.99
#>  6 g2     -7.22      -7.22
#>  7 g2     -1.99      -9.21
#>  8 g2     -1.13     -10.3 
#>  9 g2     -0.15     -10.5 
#> 10 g2      1.31     -11.8 
#> 11 g2      1.37     -13.2 
#> 12 g2      1.98     -15.2 
#> 13 g2      5.84     -21.0

相关问题