You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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))

原代码问题

你编写的代码存在以下问题:

  1. 没有按Name分组,补全逻辑会全局执行,无法为每个分组单独计算起始周
  2. 没有处理跨年的周序列,仅固定补全到53周,无法覆盖多个年份的补全需求
  3. fill函数前遗漏管道符%>%,且年份字段名拼写错误,原数据字段为大写Year不是小写year
  4. 没有限定终止边界为数据集最大年份的最近周,会生成多余的无效周记录

修正后代码

首先需要加载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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 07:15:07