这类似于previous post累加和,根据另一列中的值重置,除了我想限制总和以便它在达到最大值时也重置。例如,如果最大值为3:
> 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.我想避免使用循环。
答案 0 :(得分: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
答案 1 :(得分: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