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

