如何将R语言Loess平滑绘图代码批量应用到数据多列?
数据集逐列批量应用Loess平滑绘图实现方案
原示例代码是针对uempmed单个数值列完成「Loess平滑拟合+原始序列/平滑结果同图绘制」的流程,批量应用到全列的核心逻辑是:先排除时间列、索引列这类不需要做平滑的非目标列,再复用单列表处理逻辑遍历所有目标数值列即可。
方案1:基础R实现(无额外依赖,最适合新手)
不需要安装任何第三方包,直接运行即可:
- 第一步:导入自己的数据集,添加建模需要的行索引列
- 第二步:指定不需要做平滑的列(比如时间列、索引列、分类列),自动筛选所有待处理的数值列
- 第三步:封装单列表的建模、预测、绘图逻辑成通用函数
- 第四步:批量遍历所有目标列执行处理,可选择把平滑结果存为新数据集
# 示例数据加载,用自己数据集时替换成read.csv等读入代码即可 data(economics, package = "ggplot2") # 新增行索引列,Loess建模需要用到 economics$index <- 1:nrow(economics) # 配置:把不需要做平滑的列名写到这个向量里 exclude_cols <- c("date", "index") # 自动提取所有待处理的数值列 target_cols <- colnames(economics)[!colnames(economics) %in% exclude_cols] # 单列表处理通用函数 process_single_col <- function(col_name, df, span = 0.1){ # 动态构建模型公式 loess_formula <- as.formula(paste0(col_name, " ~ index")) # 拟合Loess模型 model <- loess(loess_formula, data = df, span = span) # 计算平滑结果 smoothed <- predict(model) # 绘制原始序列+平滑线 plot(df[[col_name]], x = df$date, type = "l", main = paste0("Loess Smoothing: ", col_name), xlab = "Date", ylab = col_name) lines(smoothed, x = df$date, col = "red") # 返回平滑值方便后续存储 return(smoothed) } # 批量执行所有列的处理 all_smoothed <- lapply(target_cols, process_single_col, df = economics) # 整理平滑结果为数据框,可直接导出 names(all_smoothed) <- paste0("smooth_", target_cols) smoothed_dataset <- as.data.frame(all_smoothed)
方案2:tidyverse实现(适合习惯管道操作的用户)
如果平时用tidyverse生态的函数,可以用长表转换的方式批量处理,代码更简洁:
library(ggplot2) library(dplyr) library(tidyr) data(economics, package = "ggplot2") economics$index <- 1:nrow(economics) exclude_cols <- c("date", "index") target_cols <- colnames(economics)[!colnames(economics) %in% exclude_cols] # 长表转换后批量拟合平滑值 economics_long <- economics %>% pivot_longer(cols = all_of(target_cols), names_to = "var", values_to = "raw_value") %>% group_by(var) %>% mutate(smooth_value = predict(loess(raw_value ~ index, span = 0.1))) # 批量生成ggplot图,存在列表里按需调用 plot_list <- economics_long %>% group_map(~{ ggplot(.x, aes(x = date)) + geom_line(aes(y = raw_value), linewidth = 0.5) + geom_line(aes(y = smooth_value), color = "red", linewidth = 0.8) + labs(title = paste0("Loess Smoothing: ", .y$var), x = "Date", y = .y$var) }) # 调用示例:查看第一个变量的图直接运行 plot_list[[1]]
注意事项
运行前请先通过str(你的数据集)确认列类型,所有字符、分类、时间类非数值列都要加到exclude_cols列表里,否则Loess建模会报错
- 如果你的数据集没有类似
date的时间列,绘图时把x轴对应参数改成x = df$index即可,x轴标签同步改为"Row Index" span参数控制平滑强度:数值越小曲线越贴合原始数据、波动越明显;数值越大曲线越平滑,可以根据自己的分析需求调整- 需要把批量生成的图存到本地的话,基础R方案可以在循环前加
pdf("loess_output.pdf"),循环结束后加dev.off(),所有图会自动保存到PDF文件里,不会挨个弹窗;tidyverse方案可以用ggsave配合循环逐张保存。
内容的提问来源于stack exchange,提问作者Gemma Howie
相关产品推荐
相关产品推荐

