R语言中替换指定日期Actual列最小值为前后观测值均值的优化方法
问题:替换指定日期内Actual列最小值为前后观测值的平均值
我有一个名为nh4.df的数据框,其中Date列包含900多个日期,每个日期对应多条观测记录。需要筛选出指定日期(例如"2020-12-03"和"2021-02-05"),找到这些日期内Actual列的最小值,并将该最小值替换为其所在位置前后观测值的平均值。
示例数据
Date <- c("2020-12-03", "2020-12-03", "2020-12-03", "2021-01-01", "2021-01-01", "2021-01-01", "2021-02-02", "2021-02-02", "2021-02-02", "2021-02-05", "2021-02-05", "2021-02-05") Actual <- c(10, 1, 11, 12, 13, 14, 10, 11, 10, 17, 2, 18) nh4.df <- data.frame(Date, Actual)
对应的原始表格:
| Date | Actual |
|---|---|
| 2020-12-03 | 10 |
| 2020-12-03 | 1 |
| 2020-12-03 | 11 |
| 2021-01-01 | 12 |
| 2021-01-01 | 13 |
| 2021-01-01 | 14 |
| 2021-02-02 | 10 |
| 2021-02-02 | 11 |
| 2021-02-02 | 10 |
| 2021-02-05 | 17 |
| 2021-02-05 | 2 |
| 2021-02-05 | 18 |
示例处理需求
在上述示例中,需处理"2020-12-03"和"2021-02-05"两个日期:
- 将
2020-12-03的最小值1替换为前后值的平均值(10+11)/2=10.5 - 将
2021-02-05的最小值2替换为前后值的平均值(17+18)/2=17.5
解决方案(基于dplyr的高效实现)
使用dplyr的向量化操作可以高效处理大型数据集,避免循环带来的性能损耗,具体实现如下:
library(dplyr) # 定义需要处理的目标日期 target_dates <- c("2020-12-03", "2021-02-05") nh4_processed <- nh4.df %>% # 计算当前行的前一个、后一个Actual值及二者平均值 mutate( prev_actual = lag(Actual), next_actual = lead(Actual), avg_prev_next = (prev_actual + next_actual)/2, # 标记目标日期内的最小值行 is_target_min = Date %in% target_dates & Actual == min(Actual, na.rm = TRUE), # 仅对标记行替换值,其余保留原数据 Actual = ifelse(is_target_min, avg_prev_next, Actual) ) %>% # 移除临时计算列(可选操作) select(-prev_actual, -next_actual, -avg_prev_next, -is_target_min) # 查看处理结果 print(nh4_processed)
代码说明
lag(Actual)和lead(Actual):通过窗口函数获取当前行的相邻前/后观测值,确保替换逻辑基于数据框中的实际相邻记录min(Actual, na.rm = TRUE):在目标日期范围内定位最小值,结合Date %in% target_dates精准标记需要修改的行- 向量化操作:整个流程无需循环,处理900+日期的大型数据集时性能更优
处理后结果
| Date | Actual |
|---|---|
| 2020-12-03 | 10.0 |
| 2020-12-03 | 10.5 |
| 2020-12-03 | 11.0 |
| 2021-01-01 | 12.0 |
| 2021-01-01 | 13.0 |
| 2021-01-01 | 14.0 |
| 2021-02-02 | 10.0 |
| 2021-02-02 | 11.0 |
| 2021-02-02 | 10.0 |
| 2021-02-05 | 17.0 |
| 2021-02-05 | 17.5 |
| 2021-02-05 | 18.0 |
内容的提问来源于stack exchange,提问作者Marina
相关产品推荐
相关产品推荐

