如何在R中对含重复行的分组执行日期维度的lag操作
解决方案
要实现按公司分组取上一日期的价格作为滞后值,同时保留原数据所有行,可以通过先提取公司-日期层面的价格并生成滞后值,再关联回原数据集的方式解决:
library(dplyr) # 第一步:生成每个公司各日期对应的滞后价格(仅处理到日期维度) date_level_lags <- data %>% # 提取唯一的公司-日期组合,保留价格 distinct(company, date, .keep_all = TRUE) %>% # 按公司分组 group_by(company) %>% # 生成该公司上一日期的价格 mutate(lagged_price = lag(price)) %>% ungroup() # 第二步:将滞后值关联回原数据集,保留所有原始行 out <- data %>% left_join(date_level_lags, by = c("company", "date", "price"))
代码说明
distinct(company, date, .keep_all = TRUE):仅保留每个公司不同日期的唯一记录,避免重复处理同一日期的价格,这一步不会修改原数据集的行数,只是生成一个精简的日期维度辅助表。- 对辅助表按公司分组后用
lag(price),就能得到每个日期对应的上一日期价格,解决了原代码中按行滞后的问题。 left_join将辅助表的滞后值匹配回原数据集的每一行,确保所有原始行都被保留,且同一日期的所有行都会拿到相同的上一日期价格。
验证结果
运行上述代码后,out的结果将完全符合需求:
| date | price | company | lagged_price |
|---|---|---|---|
| 2000-10-01 | 18 | A | NA |
| 2001-10-01 | 20 | A | 18 |
| 2001-10-01 | 20 | A | 18 |
| 2001-10-01 | 20 | A | 18 |
内容的提问来源于stack exchange,提问作者fsure
相关产品推荐
相关产品推荐

