我正试图添加一列到我的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)
2条答案
按热度按时间sz81bmfz1#
因为你想减去正值,然后加上正值,这和想得到数字的负绝对值是一样的。使用
dplyr
最直接的方法是:或者用碱基R:
输出量:
ltqd579y2#
可以计算负绝对值的累计和: