【问题标题】:Cumulative sum for variables with similar names in RR中具有相似名称的变量的累积和
【发布时间】:2020-07-06 16:16:43
【问题描述】:
df_test <- data.frame(MONTH_NUM = c(7,7,8,8,8,10,11,12,1,2,3,4,4,5,5,5,5,NA)
                      , YEAR = c(2018,2018,2018,2018,2019,2019,2019,2019,2019,2018,2018,2019,2018,2018,2018,2018,2018,NA)
                      , Sys_Indicator = c(1,0,0,1,0,0,0,0,1,1,0,1,0,1,1,1,1,1)
                      , lbl_Indicator = c(1,1,1,1,0,1,0,0,1,1,0,1,1,1,1,1,1,0)
                      , Pk_Indicator=c(1,0,1,1,0,1,0,0,1,1,0,1,0,0,0,0,1,1))

我想找到每个月+年组合的每个指标的累积总和。我目前正在使用 dplyr 来实现这一点,但我想知道是否有更简单的方法可以做到这一点,并对名称中包含和 Indicator 的所有变量执行此操作?我希望所有带有指标的变量都具有累积和。

df_test %>% 
 group_by(YEAR,MONTH_NUM) %>% 
 summarize(Sys_sum=sum(Sys_Indicator),lbl_Sum=sum(lbl_Indicator),Pk_Sum=sum(Pk_Indicator)) %>%
    arrange(MONTH_NUM,YEAR) %>%
    ungroup() %>% 
mutate(Sys_cum=cumsum(Sys_sum),Cum_lbl=cumsum(lbl_Sum),Pk_sum=cumsum(Pk_Sum))

【问题讨论】:

    标签: r dplyr cumulative-sum


    【解决方案1】:

    您可以使用dplyr 中的_at 变体将其应用于多个列:

    library(dplyr)
    
    df_test %>% 
      arrange(MONTH_NUM,YEAR) %>%
      group_by(YEAR,MONTH_NUM) %>% 
      summarize_at(vars(ends_with('Indicator')), sum) %>%
      ungroup() %>% 
      mutate_at(vars(ends_with('Indicator')), list(cs = ~cumsum(.)))
    
    
    #      YEAR MONTH_NUM Sys_Indicator lbl_Indicator Pk_Indicator Sys_Indicator_cs lbl_Indicator_cs Pk_Indicator_cs
    #   <dbl>     <dbl>         <dbl>         <dbl>        <dbl>            <dbl>            <dbl>           <dbl>
    # 1  2018         2             1             1            1                1                1               1
    # 2  2018         3             0             0            0                1                1               1
    # 3  2018         4             0             1            0                1                2               1
    # 4  2018         5             4             4            1                5                6               2
    # 5  2018         7             1             2            1                6                8               3
    # 6  2018         8             1             2            2                7               10               5
    # 7  2019         1             1             1            1                8               11               6
    # 8  2019         4             1             1            1                9               12               7
    # 9  2019         8             0             0            0                9               12               7
    #10  2019        10             0             1            1                9               13               8
    #11  2019        11             0             0            0                9               13               8
    #12  2019        12             0             0            0                9               13               8
    #13    NA        NA             1             0            1               10               13               9
    

    【讨论】:

    • 这行得通,谢谢!一个简单的问题,我怎样才能将 cumsum 列添加到原始数据中而不是有这个汇总视图?
    • 而且我还想包含结尾有“二进制”的变量。我可以做一个简单的 ends_with('Indicator|binary') 吗?
    • @Mel 您可以使用mutate_at 而不是summarise_at 来保持相同的行数,但它不会给出相同的cumsum 值,因为现在我们有更多的行。要包含多个这样的模式,我们可以像这样使用matches mutate_at(vars(matches('Indicator$|binary$')), list(cs = ~cumsum(.)))
    • 那么有没有办法使用 dplyr 获取每行数据的 cumsum 呢?
    • 每一行的cumsum 是什么意思?
    【解决方案2】:

    我想我明白你想要什么。这是一个 data.table 方法。

    library(data.table)
    setDT(df_test)[ ,sapply(names(df_test)[grep("Indicator",names(df_test))],paste0,"_cumsum") := lapply(.SD[,grep("Indicator",names(df_test))],cumsum)]
    df_test
        MONTH_NUM YEAR Sys_Indicator lbl_Indicator Pk_Indicator Sys_Indicator_cumsum lbl_Indicator_cumsum Pk_Indicator_cumsum
     1:         7 2018             1             1            1                    1                    1                   1
     2:         7 2018             0             1            0                    1                    2                   1
     3:         8 2018             0             1            1                    1                    3                   2
     4:         8 2018             1             1            1                    2                    4                   3
     5:         8 2019             0             0            0                    2                    4                   3
     6:        10 2019             0             1            1                    2                    5                   4
     7:        11 2019             0             0            0                    2                    5                   4
     8:        12 2019             0             0            0                    2                    5                   4
     9:         1 2019             1             1            1                    3                    6                   5
    10:         2 2018             1             1            1                    4                    7                   6
    11:         3 2018             0             0            0                    4                    7                   6
    12:         4 2019             1             1            1                    5                    8                   7
    13:         4 2018             0             1            0                    5                    9                   7
    14:         5 2018             1             1            0                    6                   10                   7
    15:         5 2018             1             1            0                    7                   11                   7
    16:         5 2018             1             1            0                    8                   12                   7
    17:         5 2018             1             1            1                    9                   13                   8
    18:        NA   NA             1             0            1                   10                   13                   9
    
    

    【讨论】:

    • 谢谢伊恩!这也有效,有没有办法摆脱 NA Month_Num 和 Year 的 cumsum?
    猜你喜欢
    • 2020-06-16
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-12
    相关资源
    最近更新 更多