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

如何用R实现从2010年数值到2021年0的列方向线性序列填充?

解决方案:在R中实现线性填充(对应Excel「填充>系列>线性」)

针对需求——将每个item的2010年数值线性递减填充至2021年的0,这里提供两种实用的R实现方法:

方法一:使用tidyverse工具链(推荐,代码更清晰)

先确保安装并加载tidyverse包,通过宽转长、分组插值、长转宽的流程实现:

# 构造示例数据(已有test1可跳过)
library(tidyverse)
test1 <- tibble(
  item = c("A", "B", "C", "D"),
  `2010` = c(0.808, 0.725, 0.113, 0.158),
  `2011` = rep(NA, 4),
  `2012` = rep(NA, 4),
  `2013` = rep(NA, 4),
  `2014` = rep(NA, 4),
  `2015` = rep(NA, 4),
  `2016` = rep(NA, 4),
  `2017` = rep(NA, 4),
  `2018` = rep(NA, 4),
  `2019` = rep(NA, 4),
  `2020` = rep(NA, 4),
  `2021` = rep(0, 4)
)

# 执行线性填充
test_filled <- test1 %>%
  pivot_longer(cols = -item, names_to = "year", values_to = "value") %>%
  mutate(year = as.integer(year)) %>%
  group_by(item) %>%
  mutate(value = approx(x = year, y = value, xout = year)$y) %>%
  pivot_wider(names_from = year, values_from = value) %>%
  ungroup()

# 查看结果
print(test_filled)

代码说明

  • pivot_longer:将宽格式的年份列转为长格式的year和value列,方便按item分组处理
  • approx:核心函数,自动识别每个item的已知值(2010年数值和2021年的0),对中间年份做线性插值,完全匹配Excel的线性填充逻辑
  • pivot_wider:将处理后的长格式转回需求的宽格式

方法二:使用基础R的apply函数

若不想加载额外包,可通过基础R的逐行处理实现:

# 构造示例数据(已有test1可跳过)
test1 <- data.frame(
  item = c("A", "B", "C", "D"),
  `2010` = c(0.808, 0.725, 0.113, 0.158),
  `2011` = rep(NA, 4),
  `2012` = rep(NA, 4),
  `2013` = rep(NA, 4),
  `2014` = rep(NA, 4),
  `2015` = rep(NA, 4),
  `2016` = rep(NA, 4),
  `2017` = rep(NA, 4),
  `2018` = rep(NA, 4),
  `2019` = rep(NA, 4),
  `2020` = rep(NA, 4),
  `2021` = rep(0, 4),
  stringsAsFactors = FALSE
)

# 获取所有年份的数值向量
years <- as.integer(colnames(test1)[-1])

# 逐行生成线性序列
test_filled_base <- test1
test_filled_base[, -1] <- t(apply(test_filled_base[, -1], 1, function(row) {
  known_points_x <- c(2010, 2021)
  known_points_y <- c(row["2010"], row["2021"])
  approx(x = known_points_x, y = known_points_y, xout = years)$y
}))

# 查看结果
print(test_filled_base)

你的尝试代码问题分析

你之前的代码逻辑存在偏差:

y <- test1$"2010"
x <- test1$"2021"
predict(lm(y ~ x), list(x = test1[,c("2011":"2020")]))

这里用lm(y ~ x)拟合的是2010值与2021值的线性关系,但2021值全为0,拟合出的模型没有实际意义,无法生成中间年份的线性序列。正确思路是以年份为自变量、对应数值为因变量,基于2010和2021两个已知点对中间年份插值,这也是上述两种方法的核心逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 04:17:05