如何用前后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
相关产品推荐
相关产品推荐

