【问题标题】:Calculate conditional cumulative sum计算条件累积和
【发布时间】:2019-01-21 01:06:25
【问题描述】:

我有以下数据框:

N=seq(1:18)
Pre=c(0.5, 0.4, 0.7, 0.9, 0.6, 0.3, 0.7, 0.8, 0.6, 0.5, 0.4, 0.7, 0.9, 0.6, 0.3, 0.7, 0.8, 0.6)
df1=data.frame(N, Pre)

E=c(3.1, 2.9, 4.4)
Category=c(22,35,36)
df2=data.frame(E, Category)

我想在 df1 中创建两个新列(cumsumcategory

cumsum 列中的值将累积,直到该值等于或小于 df2$E 的值,当它大于时,cumsum 将重新开始。在category 列中,值将是 22,35 或 36 等。

结果是

这是一个简短的示例,我需要使用非常大的数据框来执行此操作。

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    要获得Category 列,我们可以cut cumsum 的值Pre 并将breaks 定义为Ecumsumdf2labels 分别为@987654333 .现在,我们可以使用这个Category 值作为分组变量,并使用ave 在每个组中取cumsumPre 值。

    df1$Category <- cut(cumsum(df1$Pre), breaks = c(0, cumsum(df2$E)), 
                                        labels = df2$Category)
    
    df1$Cumsum <- ave(df1$Pre, df1$Category, FUN = cumsum)
    
    
    df1
    #    N Pre Category Cumsum
    #1   1 0.5       22    0.5
    #2   2 0.4       22    0.9
    #3   3 0.7       22    1.6
    #4   4 0.9       22    2.5
    #5   5 0.6       22    3.1
    #6   6 0.3       35    0.3
    #7   7 0.7       35    1.0
    #8   8 0.8       35    1.8
    #9   9 0.6       35    2.4
    #10 10 0.5       35    2.9
    #11 11 0.4       36    0.4
    #12 12 0.7       36    1.1
    #13 13 0.9       36    2.0
    #14 14 0.6       36    2.6
    #15 15 0.3       36    2.9
    #16 16 0.7       36    3.6
    #17 17 0.8       36    4.4
    #18 18 0.6     <NA>    0.6
    

    【讨论】:

      猜你喜欢
      • 2014-02-16
      • 1970-01-01
      • 1970-01-01
      • 2021-04-23
      • 1970-01-01
      • 1970-01-01
      • 2019-07-03
      • 2019-06-06
      • 1970-01-01
      相关资源
      最近更新 更多