【问题标题】:R: cumulative sum based on another column and max sum valueR:基于另一列的累积总和和最大总和值
【发布时间】:2017-09-15 14:27:58
【问题描述】:

这类似于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。我想避免使用循环。

【问题讨论】:

    标签: r


    【解决方案1】:

    通过使用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
    

    【讨论】:

      【解决方案2】:

      基础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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多