R语言DataFrame按姓名分组补全周数至最大年份最近周的实现
R语言按分组补全年周数据实现方案
需求说明
- 对DataFrame按
Name字段分组 - 每个分组以自身最早出现的年、周为起始点,补全所有缺失的
Year、Week记录,直到整个数据集最大年份的最近周 - 缺失的
Total字段默认填充为0
示例数据
structure(list(Name = structure(c(1L, 1L, 2L, 2L), .Label = c("John", "Mary"), class = "factor"), Year = c(2021L, 2021L, 2020L, 2021L ), Week = c(1L, 5L, 3L, 5L), Total = c(3L, 2L, 1L, 2L)), class = "data.frame", row.names = c(NA, -4L))
原代码问题
你编写的代码存在以下问题:
- 没有按
Name分组,补全逻辑会全局执行,无法为每个分组单独计算起始周 - 没有处理跨年的周序列,仅固定补全到53周,无法覆盖多个年份的补全需求
fill函数前遗漏管道符%>%,且年份字段名拼写错误,原数据字段为大写Year不是小写year- 没有限定终止边界为数据集最大年份的最近周,会生成多余的无效周记录
修正后代码
首先需要加载dplyr和tidyr包:
library(dplyr) library(tidyr)
完整处理逻辑:
# 先计算全局终止边界:数据集最大年份、对应最大周 max_year <- max(data$Year) max_week <- max(data$Week[data$Year == max_year]) result <- data %>% # 按Name分组处理 group_by(Name) %>% # 计算当前分组的起始年、起始周 mutate( start_year = min(Year), start_week = min(Week[Year == start_year]) ) %>% # 补全当前分组的所有年、周组合 complete( Year = seq(first(start_year), max_year), Week = seq( # 起始年从分组起始周开始,其余年份从第1周开始 ifelse(Year == first(start_year), first(start_week), 1), # 终止年到全局最大周结束,其余年份到53周结束 ifelse(Year == max_year, max_week, 53) ), # 缺失Total填充为0 fill = list(Total = 0) ) %>% # 调整字段顺序,移除辅助列 select(Name, Year, Week, Total) %>% ungroup()
运行结果说明
用示例数据运行以上代码后:
- John分组会生成2021年1-5周的完整记录,第2、3、4周Total为0
- Mary分组会生成2020年3-53周、2021年1-5周的完整记录,中间缺失周Total为0
完全符合需求中的输出格式要求。
内容的提问来源于stack exchange,提问作者akang
相关产品推荐
相关产品推荐

