You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

对应的原始表格:

DateActual
2020-12-0310
2020-12-031
2020-12-0311
2021-01-0112
2021-01-0113
2021-01-0114
2021-02-0210
2021-02-0211
2021-02-0210
2021-02-0517
2021-02-052
2021-02-0518

示例处理需求

在上述示例中,需处理"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+日期的大型数据集时性能更优

处理后结果

DateActual
2020-12-0310.0
2020-12-0310.5
2020-12-0311.0
2021-01-0112.0
2021-01-0113.0
2021-01-0114.0
2021-02-0210.0
2021-02-0211.0
2021-02-0210.0
2021-02-0517.0
2021-02-0517.5
2021-02-0518.0

内容的提问来源于stack exchange,提问作者Marina

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 23:26:05