如何用dplyr对分组DataFrame应用线性预测函数补全历史缺失值
问题概述
我有一个长格式DataFrame,class列包含"detached"、"semidetached"、"block"三个分组;n、m2、m3列在2005-2019年的数值为空,2020-2100年有官方数据。需要用dplyr工具,将自定义的等效于ExcelFORECAST.LINEAR的预测函数,批量应用到所有分组的目标列,生成2005-2019年的预测值。
示例数据
library(tibble) library(dplyr) set.seed(123) # 生成模拟数据:2020-2100年为有效数值,2005-2019年为空 df <- expand_grid( class = c("detached", "semidetached", "block"), year = 2005:2100 ) %>% mutate( n = ifelse(year >= 2020, rnorm(n(), mean = 100 + year - 2020, sd = 5), NA), m2 = ifelse(year >= 2020, rnorm(n(), mean = 200 + (year - 2020)*1.5, sd = 8), NA), m3 = ifelse(year >= 2020, rnorm(n(), mean = 300 + (year - 2020)*2, sd = 10), NA) )
自定义FORECAST.LINEAR等效函数
forecast_linear <- function(x, y, new_x) { # x: 已知自变量(年份) # y: 已知因变量(目标列数值) # new_x: 需要预测的自变量(2005-2019年) model <- lm(y ~ x, na.action = na.exclude) predict(model, newdata = data.frame(x = new_x)) }
dplyr一站式批量预测方案
df_predicted <- df %>% group_by(class) %>% mutate( # 批量处理n、m2、m3三列 across(c(n, m2, m3), ~ ifelse( year %in% 2005:2019, # 用2020-2100年的数据拟合模型,预测当前年份的值 forecast_linear( x = year[year >= 2020], y = .[year >= 2020], new_x = year ), # 2020年及以后保留原数据 . )) ) %>% ungroup()
代码逻辑说明
group_by(class):按房屋类型分组,确保每个分组独立拟合预测模型across(c(n, m2, m3)):一次性批量处理所有目标列,避免重复代码ifelse判断年份区间:仅对2005-2019年的空值进行预测,其余年份保留原始数据- 预测函数内部提取当前分组中2020-2100年的有效数据,拟合线性模型后生成预测值
验证结果
# 查看detached分组2005-2019年的n列预测值 df_predicted %>% filter(class == "detached", year %in% 2005:2019) %>% select(year, n)
内容的提问来源于stack exchange,提问作者Vesanen
相关产品推荐
相关产品推荐

