在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
相关产品推荐
相关产品推荐

