2017-03-09 37 views
0

dplyrを使用して条件付き累積合計を計算しようとしていますが、問題が発生しています。私はデータフレームを持っていて、条件が真である限り、グループごとにcumsumしたい。次の例を参照してください:私は、次の線に沿って考えていたが、誰もがアイデアを持って、働いていないdplyrと条件付き累積和

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 

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 

はに行きますか?

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

ありがとうございます!

答えて

2

数値に論理的に変換することFALSETRUEのための1のために0を与えるので、あなたは、単にactsalesを掛けることができますが:ここでは

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 
+0

すばらしく簡単です、ありがとう! – tonyk

1

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]