如何用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
相关产品推荐
相关产品推荐

