成对时间序列数据框列表变量观测值插补问题(locf方法失效)
问题分析与解决方案
从你给出的结果来看,2015-2020年的填充值并非2014年的9.0183,而是2.582298,核心原因有两个可能:
- 数据框的行顺序未按年份升序排列:
na.locf是按照数据的行顺序进行向前填充,而非识别year列的时间逻辑顺序。如果2015年的行排在某个更早的非NA值(比如2.582298)之后,就会取这个值填充。 - 2015-2020年的
smoothtotrade原始值并非NA:na.locf只会处理NA值,若这些年份原本就有数值,函数不会对其进行覆盖。
修正代码
以下是针对性的修正方案,先确保数据按年份排序,再统一将2014年后的非NA值转为NA(如果你确认这些是无效值),最后执行向前填充:
方案1(使用dplyr简化操作)
library(imputeTS) library(dplyr) impute_smoothtotrade <- function(df) { # 1. 按年份升序排序,保证时间顺序正确 df_sorted <- df %>% arrange(year) # 2. 将2014年后的非NA值强制转为NA(根据你的需求) df_sorted <- df_sorted %>% mutate(smoothtotrade = ifelse(year > 2014 & !is.na(smoothtotrade), NA, smoothtotrade)) # 3. 执行向前填充 df_sorted$smoothtotrade <- na.locf(df_sorted$smoothtotrade) return(df_sorted) } # 循环处理每个数据框 for (i in seq_along(data_frames)) { data_frames[[i]] <- impute_smoothtotrade(data_frames[[i]]) }
方案2(仅使用base R)
library(imputeTS) impute_smoothtotrade <- function(df) { # 1. 按年份升序排序 df_sorted <- df[order(df$year), ] # 2. 将2014年后的非NA值转为NA df_sorted$smoothtotrade[df_sorted$year > 2014 & !is.na(df_sorted$smoothtotrade)] <- NA # 3. 向前填充 df_sorted$smoothtotrade <- na.locf(df_sorted$smoothtotrade) return(df_sorted) } # 循环处理每个数据框 for (i in seq_along(data_frames)) { data_frames[[i]] <- impute_smoothtotrade(data_frames[[i]]) }
验证步骤
执行代码后,可以抽取一组国家对数据验证:
# 抽取AUT-CMR的数据验证 aut_cmr_data <- data_frames[[which(sapply(data_frames, function(x) any(x$country1 == "AUT" & x$country2 == "CMR")))]] print(aut_cmr_data[aut_cmr_data$year >=2010, ])
内容的提问来源于stack exchange,提问作者dorokal
相关产品推荐
相关产品推荐

