在R语言中基于前前年度数据为数据集新增PPR列的实现问题
问题解决方法
原代码问题说明
- 数值型年份直接使用
as.Date()转换不符合函数输入要求,会生成错误的日期值,本需求中年份是纯数值,无需转换为日期格式即可直接计算。 - 原有逻辑错误:PPR列需要返回的是当前年份减2年对应的同公司REC值,而非修改年份值,原代码只对年份做了运算,没有关联匹配对应REC数据。
正确实现代码
提供两种常用实现方式:
方法1:按年份排序后使用lag偏移取值
library(dplyr) dat <- data %>% group_by(Company) %>% arrange(Year, .by_group = TRUE) %>% # 按公司分组后对年份升序排序 mutate(PPR = lag(REC, n = 2)) %>% # 取当前行往前数2行的REC值 ungroup()
方法2:直接匹配对应年份取值(无需提前排序,适配性更强)
library(dplyr) dat <- data %>% group_by(Company) %>% mutate(PPR = REC[match(Year - 2, Year)]) %>% # 匹配当前年份-2对应的REC值 ungroup()
运行结果
两种方法都可以得到你需要的结果,无匹配前前年度数据时返回NA:
| Company | Year | REC | PPR |
|---|---|---|---|
| ABC | 2019 | 300 | NA |
| ABC | 2020 | 200 | NA |
| ABC | 2021 | 100 | 300 |
| XYZ | 2017 | 3000 | NA |
| XYZ | 2018 | 4000 | NA |
| XYZ | 2019 | 2000 | 3000 |
| KJF | 2018 | 8000 | NA |
| KJF | 2019 | 6000 | NA |
| KJF | 2020 | 5000 | 8000 |
| KJF | 2021 | 7000 | 6000 |
内容的提问来源于stack exchange,提问作者Luiy_coder
相关产品推荐
相关产品推荐

