使用dplyr按n个分组层级生成重复日期序列列的问题
解决方法
你的需求核心是按每n个Period分组,提取每组最后一个Period对应的最后一个Date,再将该值填充到组内所有行。之前的rep方法无效,是因为它没有做分组处理,只能取全局最后一个Date,无法实现分组逻辑。下面提供两种常用的实现方案:
方法1:使用dplyr(推荐,代码简洁易读)
先通过分组标识把每n个Period归为一组,再提取每组最后一个Period的最后一个Date,填充到组内所有行。
示例代码
library(dplyr) # 构造测试数据(可替换为你的真实数据) df <- tibble( Period = rep(1:4, each = 3), # 每个Period对应3条记录 Date = seq(as.Date("2023-01-01"), as.Date("2023-01-12"), by = "day") ) n <- 2 # 每2个Period为一组 # 生成New_var列 df <- df %>% # 给每个Period分配组ID:每n个Period为一组 mutate(group_id = ceiling(as.integer(factor(Period)) / n)) %>% # 按组ID分组,提取组内最后一个Period的最后一个Date group_by(group_id) %>% mutate(New_var = last(Date[Period == last(Period)])) %>% ungroup() # 查看结果 print(df)
输出效果
# A tibble: 12 × 4 Period Date group_id New_var <int> <date> <dbl> <date> 1 1 2023-01-01 1 2023-01-06 2 1 2023-01-02 1 2023-01-06 3 1 2023-01-03 1 2023-01-06 4 2 2023-01-04 1 2023-01-06 5 2 2023-01-05 1 2023-01-06 6 2 2023-01-06 1 2023-01-06 7 3 2023-01-07 2 2023-01-12 8 3 2023-01-08 2 2023-01-12 9 3 2023-01-09 2 2023-01-12 10 4 2023-01-10 2 2023-01-12 11 4 2023-01-11 2 2023-01-12 12 4 2023-01-12 2 2023-01-12
方法2:使用Base R(无需额外包)
通过tapply和映射关系实现分组逻辑,适合偏好原生R语法的场景。
示例代码
# 构造测试数据 df <- data.frame( Period = rep(1:4, each = 3), Date = seq(as.Date("2023-01-01"), as.Date("2023-01-12"), by = "day") ) n <- 2 # 步骤1:获取每个Period对应的最后一个Date period_last_date <- tapply(df$Date, df$Period, last) # 步骤2:给Period分配组ID periods <- names(period_last_date) group_ids <- ceiling(seq_along(periods) / n) # 步骤3:获取每个组的最后一个Date group_last_date <- tapply(period_last_date, group_ids, last) # 步骤4:将组最后Date映射到每个Period period_to_newvar <- rep(group_last_date, each = n)[1:length(periods)] names(period_to_newvar) <- periods # 步骤5:赋值到原数据 df$New_var <- period_to_newvar[as.character(df$Period)] # 查看结果 print(df)
内容的提问来源于stack exchange,提问作者Ana Castanheira
相关产品推荐
相关产品推荐

