如何创建可批量计算多个统计量的R自定义函数
实现方案
第一步:封装单组向量的统计函数
先把你需要的所有统计逻辑封装成可复用的函数,只需传入两个待分析的向量即可返回所有指标结果:
# 依赖包:如果没有mae、bias函数可先安装加载Metrics包 # install.packages("Metrics") library(Metrics) calc_vec_stats <- function(v1, v2, round_digits = 4) { # 基础校验:避免向量长度不匹配、非数值输入导致报错 stopifnot(length(v1) == length(v2), is.numeric(v1), is.numeric(v2)) # 计算各统计指标,可按需增减 r2 <- round(`cor`(v1, v2, method = "pearson")^2, round_digits) mae_val <- round(`MAE`(v1, v2), round_digits) bias_val <- round(`bias`(v1, v2), round_digits) sd_diff <- round(`sd`(v1 - v2), round_digits) t_p <- round(`t.test`(v1, v2)$p.value, round_digits) # 卡方检验适配:分类数据正常返回p值,连续数值输入自动返回NA避免报错 chisq_p <- tryCatch( round(`chisq.test`(v1, v2)$p.value, round_digits), error = function(e) NA ) # 返回结构化单条结果 return(data.frame( R2 = r2, MAE = mae_val, bias = bias_val, sd_diff = sd_diff, t_test_p = t_p, chisq_test_p = chisq_p )) }
第二步:批量处理多组数据
用批量遍历的方式替代逐行重复写代码,效率更高也更容易维护:
# 依赖包:purrr用于批量运算,没有的话先安装 # install.packages("purrr") library(purrr) # 定义所有需要计算的批次 batch_list <- c("15_18", "16_19", "17_20", "18_21", "19_22") # 批量计算所有批次的结果,直接合并为结构化数据框 final_result <- map_dfr(batch_list, function(batch) { # 拆分批次对应的年份标识 y1 <- substr(batch, 1, 2) y2 <- substr(batch, 4, 5) # 提取对应数据集和目标向量 target_df <- get(paste0("study_", batch)) v_potential <- target_df[[paste0("potential_", y1)]] v_overall <- target_df[[paste0("overall_", y2)]] # 调用统计函数,拼接批次标识返回 cbind(comparison = batch, calc_vec_stats(v_potential, v_overall)) }) # 输出结果即可得到你需要的结构化表格 print(final_result)
补充说明
- 可扩展性:后续如果要新增其他统计指标,仅需在
calc_vec_stats函数中补充对应计算逻辑即可,无需修改批量运行的代码 - 稳定性优化:如果你的所有
study_xx_xx数据集可提前整理为一个命名列表(列表元素名称为15_18/16_19等批次名),可以替代get()函数从全局环境提取数据的逻辑,避免变量名冲突问题
内容的提问来源于stack exchange,提问作者Xavier
相关产品推荐
相关产品推荐

