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

如何用前后24小时同时段均值填充多缺失值的动物小时移动数据?

用前后24小时同时段均值填充缺失值的解决方案

需求说明

现有每小时动物净移动量数据集,存在观测员周期性缺席导致的缺失值,需要在新列中用缺失点前后24小时同一时段的数据均值填充缺失值。

示例数据

# 生成示例数据
Day1 <- rep(1, 24)
Day2 <- rep(2, 24)
Day3 <- rep(3, 24)
Day <- c(Day1, Day2, Day3)
Hour <- rep(0:23, 3)
Net <- round(rnorm(length(Day), mean = 2))
Dat <- data.frame(Day = Day, Hour = Hour, Net = Net)

# 插入缺失值
Dat[27, 3] <- NA
Dat[31, 3] <- NA

原方法问题

原sapply函数仅能处理单个缺失值,因为代码中固定取第一个缺失值的索引位置,导致所有缺失值都用同一个均值填充。

解决方案

方案1:修正索引遍历的sapply方法

通过遍历每行的索引,针对每个缺失值单独获取其前后24小时的对应值,计算均值填充:

# 遍历每行索引,处理每个缺失值
Dat$new.net <- sapply(seq_along(Dat$Net), function(i) {
  if (is.na(Dat$Net[i])) {
    # 获取前后24小时的对应值,na.rm处理潜在的额外缺失
    mean(c(Dat$Net[i - 24], Dat$Net[i + 24]), na.rm = TRUE)
  } else {
    Dat$Net[i]
  }
})

方案2:更优雅的dplyr分组方法

利用dplyr按小时分组,通过lag和lead函数直接获取前后一天同一时段的数据,逻辑更清晰:

library(dplyr)

Dat <- Dat %>%
  group_by(Hour) %>%
  mutate(
    new.net = case_when(
      is.na(Net) ~ mean(c(lag(Net, 1), lead(Net, 1)), na.rm = TRUE),
      TRUE ~ Net
    )
  ) %>%
  ungroup()

说明

  • 两种方法均能针对每个缺失值计算专属均值,解决原方法的批量缺失值处理问题。
  • 首尾23小时的缺失值需后续单独处理,当前代码默认这些位置不存在缺失(或忽略额外缺失)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 17:15:41