R中dplyr分组处理后如何保留关联变量并计算月度height总和
R dplyr实现补全缺失月份、保留分组loc并计算月度height总和
原始测试数据构造
var = c(rep("A",3),rep("B",2),rep("C",5)) date = c(as.Date("2022/01/01"),as.Date("2022/02/01"),as.Date("2022/03/01"), as.Date("2022/01/01"),as.Date("2022/03/01"), as.Date("2022/01/01"),as.Date("2022/01/01"),as.Date("2022/02/01"),as.Date("2022/02/01"),as.Date("2022/03/01")) loc = c(rep("london",3),rep("berlin",2),rep("cairo",5)) height =c(13,14,15,13,15,16,12,14,13,15) data = tibble::tibble(var,date,loc,height)
实现代码
需要加载dplyr、tidyr做数据处理,lubridate做日期字段提取:
library(dplyr) library(tidyr) library(lubridate) result <- data %>% # 从日期字段提取月份、季度 mutate( Month = month(date), Quarter = quarter(date) ) %>% # 按变量+对应地点分组,补全每组1-3月的缺失记录 group_by(var, loc) %>% complete(Month = 1:3, fill = list(height = 0)) %>% # 分组计算月度height总和,标记数据是否为原始存在的记录 group_by(var, loc, Month) %>% summarise( Quarter = first(Quarter, default = 1), height = sum(height, na.rm = TRUE), Condition = height > 0, .groups = "drop" ) %>% # 调整字段顺序匹配预期输出 select(var, Quarter, Month, Condition, loc, height)
输出结果
运行代码后得到的结果完全匹配预期结构:
| var | Quarter | Month | Condition | loc | height |
|---|---|---|---|---|---|
| A | 1 | 1 | TRUE | london | 13 |
| A | 1 | 2 | TRUE | london | 14 |
| A | 1 | 3 | TRUE | london | 15 |
| B | 1 | 1 | TRUE | berlin | 13 |
| B | 1 | 2 | FALSE | berlin | 0 |
| B | 1 | 3 | TRUE | berlin | 15 |
| C | 1 | 1 | TRUE | cairo | 28 |
| C | 1 | 2 | TRUE | cairo | 27 |
| C | 1 | 3 | TRUE | cairo | 15 |
注意事项
- 示例数据全部为2022年第一季度记录,如果数据包含多个年份,补全时需要把年份加入分组维度,避免不同年份同月份数据混淆
- 代码默认支持同一个
var对应多个loc的场景,会自动按var+loc的组合分别补全月份、计算指标
内容的提问来源于stack exchange,提问作者Homer Jay Simpson
相关产品推荐
相关产品推荐

