如何从R语言replicate生成的列表中计算三个判定结果的占比?
计算res列表中res1/res2/res3的占比方法
下面是几种实用的实现方式,核心思路是把列表里的0/1值提取出来,计算均值(均值就是符合条件的比例)再转成百分比:
方式1:用dplyr快速处理
借助dplyr的bind_rows把列表合并成数据框,再计算列均值得到占比:
library(dplyr) # 将列表转换为数据框 res_df <- bind_rows(res) # 计算每列的占比(乘以100转为百分比) proportion <- colMeans(res_df) * 100 # 格式化输出成目标样式 sprintf("res1=%.0f%%、res2=%.0f%%、res3=%.0f%%", proportion[1], proportion[2], proportion[3])
方式2:基础R原生实现(无需额外包)
用基础R的do.call(rbind, res)把列表转成矩阵,再计算列均值:
# 把列表转为矩阵 res_matrix <- do.call(rbind, res) # 计算占比 proportion <- colMeans(res_matrix) * 100 # 输出结果 cat(sprintf("res1=%.0f%%\nres2=%.0f%%\nres3=%.0f%%", proportion[1], proportion[2], proportion[3]))
方式3:用purrr批量提取值
如果习惯tidyverse的purrr工具,可以分别提取每个指标的向量再计算:
library(purrr) # 批量提取res1、res2、res3的所有结果 res1_values <- map_dbl(res, ~.$res1) res2_values <- map_dbl(res, ~.$res2) res3_values <- map_dbl(res, ~.$res3) # 计算各自的占比 res1_prop <- mean(res1_values) * 100 res2_prop <- mean(res2_values) * 100 res3_prop <- mean(res3_values) * 100 # 格式化输出 cat(sprintf("res1=%.0f%%、res2=%.0f%%、res3=%.0f%%", res1_prop, res2_prop, res3_prop))
原理说明
因为每次重复实验生成的res1/res2/res3都是0(不符合条件)或1(符合条件),所以这些值的均值就是符合条件的次数占总次数的比例,乘以100就得到百分比形式的占比。
内容的提问来源于stack exchange,提问作者nickolakis
相关产品推荐
相关产品推荐

