首页 > 解决方案 > Dplyr 在不同的时间范围内分组百分比

问题描述

我有以下格式的数据:

  DATE     GROUP     EVENT    ELIGIBLE
2021-3-9     A         1         1
2021-3-1     A         0         0
2021-3-1     B         0         1
2021-2-20    B         1         1

我想按GROUP列对数据进行分组,然后添加三个新列,这些列按组计算以下时间范围内的 (EVENT / ELIGIBLE) 的总和。过去 3 个月,3 个月前到 6 个月前,最后一年。

我通过执行以下操作计算了没有单独时间范围的总体百分比:

grouped <-   data %>% 
              
             filter(ELIGIBLE == 1 ) %>% 

             group_by(GROUP) %>%

             mutate(count_Eligible = sum(ELIGIBLE == 1 )) %>%                
                
             mutate(count_events = sum(EVENT == 1 )) %>%

             mutate(Percentage = round(100*count_events/count_Eligible,2))

我想知道在时间范围内添加三个不同百分比的最干净的方法是什么。到目前为止,我已经使用以下代码提取日期进行过滤:

today <- Sys.Date()

three_month_lookback <- as.Date(today) - months(3)

six_month_lookback <- as.Date(today) - months(6)

one_year_lookback <- as.Date(today) - months(12)

标签: rdplyr

解决方案


我们可以创建一个函数来进行计算

library(dplyr)
library(purrr)

f1 <- function(data) {
    data %>% 
          
         filter(ELIGIBLE == 1 ) %>% 

         group_by(GROUP) %>%

         transmute(count_Eligible = sum(ELIGIBLE == 1 ),                    
                 count_events = sum(EVENT == 1 ), 
         Percentage = round(100*count_events/count_Eligible,2))


   }

然后,遍历“回溯”期间,根据“日期”列对数据进行子集化并应用函数

map2_dfr(list(three_month_lookback, six_month_lookback, 
       one_year_lookback) list(today(), three_month_lookback, today()),
        ~ data %>%
           mutate(DATE = as.Date(DATE)) %>%
           filter(DATE >= .x,  DATE <= .y) %>%
           f1(.), .id = 'grp'
    )

如果我们需要按列组合

map2(list(three_month_lookback, six_month_lookback, 
       one_year_lookback) list(today(), three_month_lookback, today()),
        ~ data %>%
           mutate(DATE = as.Date(DATE)) %>%
           filter(DATE >= .x,  DATE <= .y) %>%
           f1(.)
    ) %>%
      reduce(full_join, by = "GROUP")

推荐阅读