如何编写循环为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
相关产品推荐
相关产品推荐

