基于参考数据框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
相关产品推荐
相关产品推荐

