r - 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)
解决方案
我们可以创建一个函数来进行计算
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")
推荐阅读
- c++ - Windows Driver IOCTL 错误返回;
- r - 如何在 geom_col 上订购颜色填充?
- angular8 - 在 ng-bootstrap 中更改 toast 的位置
- react-native - 向数组添加数据时不显示数据
- swift - 遍历项目并等到所有项目都被检查成功之前 Swift
- audio - Raspbian 4.4.210、Raspberry Pi 4 上没有声音输出
- python - 检查网页python中的所有新数字
- java - 我在 Java 中的 replaceAll() 中的正则表达式不起作用
- mongodb - Loopback hasMany 关系没有返回数据
- c# - 组合框特定项目 c#