2017-09-15 96 views
4

这与累计总和类似,基于另一列中的值进行重置,但我想限制总和,以便在达到最大值时重置。例如,如果最大值是3:R:基于另一列和最大总和值的累积总和

> data.frame(x=rep(1,10), 
+ y=c(0,0,1,0,0,0,0,1,0,0), 
+ cum_sum_mod=c(1, 2, 1, 2, 3, 1, 2, 1, 2, 3)) 

    x y cum_sum_mod 
1 1 0   1 
2 1 0   2 
3 1 1   1 
4 1 0   2 
5 1 0   3 
6 1 0   1 
7 1 0   2 
8 1 1   1 
9 1 0   2 
10 1 0   3 

cum_sum_mod的和的x的列,直到它达到最大值(3)或沿y列中的值是1。我想避免使用循环。

回答

5

通过使用dplyr

library(dplyr) 

dat=data.frame(x=rep(1,10), 
      y=c(0,0,1,0,0,0,0,1,0,0)) 
dat$B=cumsum(dat$y) 
dat%>%group_by(B)%>%mutate(cum_sum_mod=ifelse(cumsum(x)%%3==0,3,cumsum(x)%%3)) 

# A tibble: 10 x 4 
# Groups: B [3] 
     x  y  B cum_sum_mod 
    <dbl> <dbl> <dbl>  <dbl> 
1  1  0  0   1 
2  1  0  0   2 
3  1  1  1   1 
4  1  0  1   2 
5  1  0  1   3 
6  1  0  1   1 
7  1  0  1   2 
8  1  1  2   1 
9  1  0  2   2 
10  1  0  2   3 
3

基础R

ave(df$x, cumsum(df$y == 1), FUN = function(x){ 
    temp = cumsum(x) 
    replace(temp, temp > 3, rep(1:3, length.out = sum(temp > 3))) 
}) 
# [1] 1 2 1 2 3 1 2 1 2 3