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

在R中对多列应用自定义函数并循环批量处理数据框的方法

解决方案

1. 单个数据框的统计计算

首先定义计算间歇性的函数,本质是统计温度大于500的数值占比,用mean()直接计算逻辑向量的均值即可(TRUE=1,FALSE=0),同时加入na.rm=TRUE处理可能的缺失值:

# 定义间歇性计算函数
intermittency <- function(x) {
  mean(x > 500, na.rm = TRUE)
}

方式一:一次性计算所有统计量(推荐)

使用dplyr::across()可以在一次summarize中完成均值、最小值、最大值和间歇性的计算,效率更高:

library(dplyr)

# 对单个数据框df1计算所有统计量
single_exp_stats <- df1 %>%
  summarize(
    # 对所有以Temperature_开头的列计算4种统计量
    across(starts_with("Temperature_"), list(
      mean = ~mean(.x, na.rm = TRUE),
      min = ~min(.x, na.rm = TRUE),
      max = ~max(.x, na.rm = TRUE),
      intermittency = intermittency
    ))
  ) %>%
  # 添加实验编号(单个文件时手动指定)
  mutate(Experiment_ID = "C2700") %>%
  # 将实验编号列移到最前面
  relocate(Experiment_ID, .before = everything())

方式二:兼容原有代码逻辑

如果你想沿用原来分开计算再合并的方式,可按以下方式实现:

# 计算各统计量
stats_mean <- df1 %>% select(starts_with("Temperature_")) %>% summarize_all(~mean(.x, na.rm = TRUE))
stats_min <- df1 %>% select(starts_with("Temperature_")) %>% summarize_all(~min(.x, na.rm = TRUE))
stats_max <- df1 %>% select(starts_with("Temperature_")) %>% summarize_all(~max(.x, na.rm = TRUE))
stats_intermit <- df1 %>% select(starts_with("Temperature_")) %>% summarize_all(intermittency)

# 为每个统计结果添加类型标识
stats_mean$Stat <- "Mean"
stats_min$Stat <- "Min"
stats_max$Stat <- "Max"
stats_intermit$Stat <- "Intermittency"

# 合并并调整列顺序
stats <- rbind(stats_mean, stats_max, stats_min, stats_intermit) %>%
  relocate(Stat, .before = everything())

2. 批量处理200个数据文件并合并结果

假设所有数据文件为CSV格式,命名规则为C2700.csv到C2890.csv,存放在当前工作目录,可使用purrr包实现批量处理:

library(purrr)
library(readr)
library(dplyr)

# 生成实验编号列表
exp_ids <- paste0("C", 2700:2890)
# 生成对应文件路径
file_paths <- paste0(exp_ids, ".csv")

# 定义批量处理函数:读入文件、计算统计量、添加实验编号
process_single_file <- function(file_path, exp_id) {
  # 读入数据
  df <- read_csv(file_path)
  
  # 计算统计量
  df_stats <- df %>%
    summarize(
      across(starts_with("Temperature_"), list(
        mean = ~mean(.x, na.rm = TRUE),
        min = ~min(.x, na.rm = TRUE),
        max = ~max(.x, na.rm = TRUE),
        intermittency = ~mean(.x > 500, na.rm = TRUE)
      ))
    ) %>%
    mutate(Experiment_ID = exp_id) %>%
    relocate(Experiment_ID, .before = everything())
  
  return(df_stats)
}

# 批量处理所有文件并合并为单个数据框
all_experiments_stats <- map2_dfr(file_paths, exp_ids, process_single_file)

执行完成后,all_experiments_stats即为包含所有实验编号、各温度列均值/最小值/最大值/间歇性的完整结果数据框。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 10:05:30