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

如何用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()

代码逻辑说明

  1. group_by(class):按房屋类型分组,确保每个分组独立拟合预测模型
  2. across(c(n, m2, m3)):一次性批量处理所有目标列,避免重复代码
  3. ifelse判断年份区间:仅对2005-2019年的空值进行预测,其余年份保留原始数据
  4. 预测函数内部提取当前分组中2020-2100年的有效数据,拟合线性模型后生成预测值

验证结果

# 查看detached分组2005-2019年的n列预测值
df_predicted %>%
  filter(class == "detached", year %in% 2005:2019) %>%
  select(year, n)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 19:20:53