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

R中如何高效存储变量与因子水平不同组合的计算结果到数据框?

实现方案

使用tidyverse生态的purrr包批量遍历所有参数组合,无需手动重复代码,直接生成目标格式的结果:

第一步:加载依赖包

library(tidyverse)

第二步:改造指标计算函数

直接返回单组参数对应的精度、召回率、F1值,同时兼容极端值(如混淆矩阵缺项、分母为0)避免报错:

calc_metrics <- function(dat, sp, hz, target, pred){
  # 生成混淆矩阵
  conf_mat <- dat %>%
    filter(v == sp & sr == hz) %>%
    select(all_of(c(target, pred))) %>%
    table() %>%
    as_tibble()

  # 提取混淆矩阵数值,处理缺项场景
  n <- conf_mat$n
  tp <- ifelse(length(n)>=4, n[4], 0)
  fp <- ifelse(length(n)>=4, n[2], 0)
  fn <- ifelse(length(n)>=4, n[3], 0)

  # 计算指标,避免分母为0报错
  p <- ifelse(tp + fp == 0, 0, tp / (tp + fp))
  r <- ifelse(tp + fn == 0, 0, tp / (tp + fn))
  f <- ifelse(p + r == 0, 0, 2 * p * r / (p + r))

  return(tibble(p = p, r = r, f = f))
}

第三步:构造所有待计算的参数组合

自动生成所有真值、预测值、分组的匹配关系,无需手动枚举:

params <- crossing(
  target = c("A", "B"),
  sp = levels(ex$v)
) %>%
  # 匹配对应预测值:真值为A时预测值为B/C/D/E,真值为B时预测值为C/D/E
  mutate(pred = case_when(
    target == "A" ~ list(c("B", "C", "D", "E")),
    target == "B" ~ list(c("C", "D", "E"))
  )) %>%
  unnest(pred) %>%
  # 固定sr取值,和原有测试逻辑保持一致,需要其他值可直接修改
  mutate(hz = 100) %>%
  # 生成对比列名,和要求的格式匹配
  mutate(Comp = paste(pred, "-", target))

第四步:批量计算并转成目标宽表

# 批量计算所有组合的指标
result_long <- params %>%
  mutate(metrics = pmap(., ~calc_metrics(dat = ex, sp = ..2, hz = ..5, target = ..1, pred = ..4))) %>%
  unnest(metrics)

# 转换为要求的宽表结构,slo对应.x、mod对应.y、fas对应.z
result_wide <- result_long %>%
  select(Comp, sp, p, r, f) %>%
  pivot_wider(
    id_cols = Comp,
    names_from = sp,
    values_from = c(p, r, f),
    names_glue = "{.value}.{c('x','y','z')[match(sp, levels(ex$v))]}"
  ) %>%
  # 调整列顺序和需求一致
  select(Comp, p.x, r.x, f.x, p.y, r.y, f.y, p.z, r.z, f.z)

输出result_wide即可得到需要的表格结构。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 18:36:00