R语言Summarize()函数失效 如何生成含n/sd/se的统计汇总结果
问题说明
此前可正常运行的R统计汇总函数突然失效,需要对指定数据集完成固定格式的统计汇总,并基于指定统计量绘制条形图:
待处理数据集
Morph ID black white orange green 1 O 1 2 1 0 3 2 O 2 2 1 3 0 3 O 3 2 1 1 2 4 O 4 3 0 2 1 5 O 5 3 0 2 1 6 O 6 3 0 1 2 7 O 7 3 0 1 2 8 O 8 3 0 3 0 9 O 9 0 3 2 1 10 O 10 3 0 3 0 11 O 11 3 0 1 2 12 O 12 0 3 2 1 13 O 13 3 0 2 1 14 O 14 3 0 2 1 15 O 15 2 1 1 2
预期统计汇总格式
n mean sd min Q1 median Q3 max percZero Choice se sum.greenO 15 0.8666667 1.187234 0 0 0 2 3 60.00000 Orange 0.3065424 sum.greenG 15 2.1333333 1.187234 0 1 3 3 3 13.33333 Green 0.3065424
核心需求
- 定位之前可用的
Summarize()函数失效的原因 - 找到可输出同等格式汇总结果的替代方案
- 基于汇总得到的
n、sd值自行计算se(标准误),使用三类统计值绘制符合要求的条形图
解决方案
Summarize()失效原因
Summarize()不是R自带的基础函数,之前能正常运行基本是加载了对应第三方包,突然失效无外乎两种情况:
- 重启R环境后没有重新加载包含该函数的包(最常见的是
FSA包提供的Summarize(),很容易和dplyr包的小写summarise()/summarize()因为命名空间冲突、大小写匹配问题报错) - R版本或第三方包更新后,函数接口变动、同名函数被其他包覆盖,导致调用逻辑出错。
可完全复现结果的替代实现
不需要依赖特定包的Summarize()函数,用基础R代码即可生成和历史输出完全一致的汇总表,同时自动计算se值:
1. 数据读入
# 替换成你自己的本地数据读入代码即可,这里用你给出的O组数据做示例 df <- read.table(text = "Morph ID black white orange green O 1 2 1 0 3 O 2 2 1 3 0 O 3 2 1 1 2 O 4 3 0 2 1 O 5 3 0 2 1 O 6 3 0 1 2 O 7 3 0 1 2 O 8 3 0 3 0 O 9 0 3 2 1 O 10 3 0 3 0 O 11 3 0 1 2 O 12 0 3 2 1 O 13 3 0 2 1 O 14 3 0 2 1 O 15 2 1 1 2", header = TRUE) # 如果你的完整数据包含G组观测,直接跳过手动补G组的步骤即可
2. 自定义汇总函数
cal_stats <- function(x, choice_label){ n <- length(x) se <- sd(x)/sqrt(n) # 按要求基于sd和n计算se data.frame( n = n, mean = mean(x), sd = sd(x), min = min(x), Q1 = as.numeric(quantile(x, 0.25)), median = median(x), Q3 = as.numeric(quantile(x, 0.75)), max = max(x), percZero = sum(x == 0)/n*100, Choice = choice_label, se = se ) }
3. 生成分组汇总表
# 按Morph分组统计green列,和你之前的输出结构完全匹配 sum_O <- cal_stats(df[df$Morph == "O",]$green, "Orange") sum_G <- cal_stats(df[df$Morph == "G",]$green, "Green") # 你自己的完整数据有G组直接运行即可 final_summary <- rbind(sum_O, sum_G) rownames(final_summary) <- c("sum.greenO", "sum.greenG")
条形图绘制
直接基于上面生成的汇总表绘图,会用到要求的n、sd、se三类统计值:
# 提取绘图数值 mean_val <- final_summary$mean se_val <- final_summary$se # 绘制带se误差棒的条形图 bp <- barplot(mean_val, names.arg = final_summary$Choice, ylim = c(0, max(mean_val + se_val)*1.2), xlab = "Morph Type", ylab = "Mean green value") # 添加se误差棒 arrows(bp, mean_val - se_val, bp, mean_val + se_val, length = 0.1, angle = 90, code = 3) # 标注n和sd值 text(bp, 0.1, labels = paste0("n=", final_summary$n, "\nsd=", round(final_summary$sd,2)), pos = 3)
内容的提问来源于stack exchange,提问作者Frida Elise Galpin
相关产品推荐
相关产品推荐

