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

如何创建可批量计算多个统计量的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 09:36:07