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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 01:01:28