dplyr的条件累加总和 [英] Conditional cumulative sum with dplyr

查看:105
本文介绍了dplyr的条件累加总和的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用dplyr计算条件累积总和,但遇到了麻烦。我有一个数据框,只要条件为真,就想按组累加。参见以下示例:

I'm trying to compute a conditional cumulative sum using dplyr but running into trouble. I have a dataframe and want to cumsum by group as long as a condition is true. See the following example:

df <- data.frame(prod = c("A", "A", "A", "A", "B", "B", "B", "B", "B"),
                 act = c(TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE),
                 sales = c(100,120, 190, 50, 30, 40, 50, 10, 30))
prod   act sales
1    A  TRUE   100
2    A  TRUE   120
3    A  TRUE   190
4    A FALSE    50
5    B  TRUE    30
6    B  TRUE    40
7    B FALSE    50
8    B FALSE    10
9    B FALSE    30

转到:

prod   act sales cum_sales
1    A  TRUE   100       100
2    A  TRUE   120       220
3    A  TRUE   190       410
4    A FALSE    50       410
5    B  TRUE    30        30
6    B  TRUE    40        70
7    B FALSE    50        70
8    B FALSE    10        70
9    B FALSE    30        70

我在思考在以下内容中,但是没有用,有人有想法吗?

I was thinking along the lines of the following but it's not working, anyone have ideas?

dfb <- df %>% group_by(prod) %>%
 mutate(cum_sales = ifelse(act == TRUE, cumsum(sales), lag(sales))) 

谢谢!

推荐答案

由于将逻辑转换为数字,对于 FALSE给出0 和1表示 TRUE ,您只需将 sales 乘以行为

Since converting a logical to numeric gives 0 for FALSE and 1 for TRUE, you can simply multiply sales by act :

library(dplyr)
df %>% group_by(prod) %>%
  mutate(cum_sales = cumsum(sales*act))

    prod   act sales cum_sales
  <fctr> <lgl> <dbl>     <dbl>
1      A  TRUE   100       100
2      A  TRUE   120       220
3      A  TRUE   190       410
4      A FALSE    50       410
5      B  TRUE    30        30
6      B  TRUE    40        70
7      B FALSE    50        70
8      B FALSE    10        70
9      B FALSE    30        70

这篇关于dplyr的条件累加总和的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆