[英]Conditional cumulative sum with dplyr
我正在嘗試使用dplyr計算條件累積總和,但遇到了麻煩。 我有一個數據框,只要條件為真,就想按組累加。 請參見以下示例:
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
我一直在考慮以下內容,但沒有用,有人有想法嗎?
dfb <- df %>% group_by(prod) %>%
mutate(cum_sales = ifelse(act == TRUE, cumsum(sales), lag(sales)))
謝謝!
由於將邏輯轉換為數字,對於FALSE
表示0,對於TRUE
1,因此您可以將act
乘以sales
:
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
這是base R
中的一些其他選項
df$cum_sales <- with(df, ave(sales*act, prod, FUN = cumsum))
和數據data.table
library(data.table)
setDT(df)[, cum_sales := sales*act, by = prod]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.