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

如何编写循环为R数据框按工期添加周起始日期递增的记录行

R按项目工期展开周维度行实现方案

你之前用rep复制对应行数的思路完全可行,不需要写复杂的while/for循环,用tidyverse生态的向量化操作就能快速实现,且周日期自动按7天递增,其余字段保留原始值。

方法1:分组汇总实现(逻辑最直观)

library(tidyverse)
library(lubridate)

my_tibble_expanded <- my_tibble %>%
  group_by(Project) %>%
  summarise(
    # 生成0到工期-1的周偏移量,对应工期总周数
    week_offset = 0:(first(Duration) - 1),
    # 原始起始日加对应周数的偏移,得到每周的起始日期
    Week_Start_Day = first(Week_Start_Day) + weeks(week_offset),
    # 其余字段直接保留原始值
    Duration = first(Duration),
    Weekly_Hours = first(Weekly_Hours),
    .groups = "drop"
  ) %>%
  # 删除临时生成的偏移量辅助列
  select(-week_offset)

方法2:基于uncount的行复制实现(和你之前的rep思路一致)

uncount是tidyr内置的按指定次数复制行的函数,和你写的lapply(..., rep)效果完全一致,只需要补上周日期的递增计算即可:

my_tibble_expanded2 <- my_tibble %>%
  # 按Duration值复制对应行数,自动生成从1开始的行ID作为周偏移标记
  uncount(Duration, .id = "week_offset") %>%
  # 偏移量从1开始,减1后乘7天得到日期偏移量,加到原始起始日上
  mutate(Week_Start_Day = Week_Start_Day + days(7*(week_offset - 1))) %>%
  select(-week_offset)

效果验证

运行后得到的结果完全符合预期:

  • ClientA(Duration=8)生成8行,日期依次为2022-06-06、2022-06-13、2022-06-20……直到第8周的日期
  • ClientB(Duration=1)仅保留原始1行,日期不变
  • ClientC(Duration=3)生成3行,日期依次为2022-07-04、2022-07-11、2022-07-18
  • 所有行的Duration、Weekly_Hours、Project字段和原始记录完全一致

内容的提问来源于stack exchange,提问作者Stephen Poole

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 00:18:19