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

基于参考数据框sp为other补全缺失日期并均值填充缺失值

补全R语言数据框缺失日期并填充相邻均值

我们有两个R数据框sp和other,均包含日期列与对应数值列。需要以sp为基准,为other补全所有缺失的日期,且缺失日期的数值用其前后相邻日期的数值均值填充(例如other缺失2004-08-26,需填充2004-08-25和2004-08-27的数值均值)。

数据定义

sp <- data.frame(date=c("2004-08-20", "2004-08-23", "2004-08-24", "2004-08-25",
                        "2004-08-26", "2004-08-27"), value=c(1, 2, 4, 5, 10, 11))

other <- data.frame(date=c("2004-08-20", "2004-08-23", "2004-08-24", "2004-08-25",
                           "2004-08-27"), value=c(2, 4, 5, 10, 11))

实现方法

方法一:Base R 结合 zoo 包(推荐)

借助zoo包的na.approx函数可快速完成缺失值的线性插值(相邻值的插值即为均值):

# 转换日期列为Date类型
sp$date <- as.Date(sp$date)
other$date <- as.Date(other$date)

# 以sp的日期为基准合并数据,保留所有sp的日期
other_full <- merge(sp[, "drop=FALSE"], other, by = "date", all.x = TRUE)
# 整理列名
colnames(other_full) <- c("date", "sp_value", "other_value")

# 安装并加载zoo包
# install.packages("zoo")
library(zoo)
# 填充缺失值
other_full$other_value <- na.approx(other_full$other_value)

# 查看结果
print(other_full)

方法二:纯Base R实现

如果不想依赖第三方包,可手动遍历缺失位置计算均值:

# 转换日期类型
sp$date <- as.Date(sp$date)
other$date <- as.Date(other$date)

# 合并得到完整日期框架
other_full <- merge(sp[, "drop=FALSE"], other, by = "date", all.x = TRUE)
colnames(other_full) <- c("date", "sp_value", "other_value")

# 定位缺失值位置
na_positions <- which(is.na(other_full$other_value))

# 遍历填充均值
for(pos in na_positions) {
  # 找到前一个非缺失值的位置
  prev_pos <- max(which(!is.na(other_full$other_value[1:(pos-1)])))
  # 找到后一个非缺失值的位置
  next_pos <- min(which(!is.na(other_full$other_value[(pos+1):nrow(other_full)]))) + pos
  # 计算并填充均值
  other_full$other_value[pos] <- mean(c(other_full$other_value[prev_pos], other_full$other_value[next_pos]))
}

# 查看结果
print(other_full)

方法三:Tidyverse 生态实现

用dplyr和tidyr配合zoo包,代码更简洁易读:

# 安装并加载tidyverse与lubridate
# install.packages("tidyverse")
library(tidyverse)
library(lubridate)
library(zoo)

other_full <- sp %>%
  select(date) %>% # 提取sp的所有日期
  left_join(other, by = "date") %>% # 合并other数据,缺失值为NA
  mutate(date = ymd(date)) %>% # 标准化日期格式
  mutate(value = na.approx(value)) # 填充缺失值

# 查看结果
print(other_full)

输出结果

三种方法最终都会得到补全后的other_full:

date value
1 2004-08-20     2
2 2004-08-23     4
3 2004-08-24     5
4 2004-08-25    10
5 2004-08-26    10.5
6 2004-08-27    11

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 08:25:33