查看原文
其他

【Tidyverse优雅编程】:整洁数据统计分析流程案例

张敬信 R语言与数学建模 2023-04-17

来自知乎问题:

如何用R画分组柱状图并且添加标准差和显著性标记(星号)?

https://www.zhihu.com/question/59517660/answer/2838254742

我看到其中 Shawn Wang 的回答,代码的陈旧啰嗦程度实在是看不下去,通篇:

  • 还在用史前的 reshape2 做数据重塑,

  • 逐元素 `for` 循环,没有操作数据的思维

  • base R 为主,又间杂着 tidyverse 的 ggplot()filter()等,不伦不类

我用 tidyverse 全部改写了一遍,看看如今 R 语言是如何整洁优雅的做数据统计分析的。




加载包:

library(tidyverse)
library(rstatix) # 整洁统计检验

生成模拟数据:

set.seed(123)
df = tibble(Sample = rep(c("A","B","C"), each = 7),
root = c(rnorm(7,10), rnorm(7,5), rnorm(7,21)),
leaf = c(rnorm(7,9), rnorm(7,4), rnorm(7,32)),
stem = rnorm(21,8))
df

数据重塑:宽变长

df1 = df %>%
pivot_longer(-1, names_to = "Tissue", values_to = "value")
df1

分组正态性检验

df1 %>%
group_by(Sample, Tissue) %>%
shapiro_test(value)

注:原来是列名命名的问题,直接分组统计检验是可以的。不必用批量建模的思路。

批量绘制Q-Q图(分面就行):

ggplot(df1, aes(sample = value)) +
stat_qq() +
stat_qq_line(color = "red") +
facet_wrap(Sample ~ Tissue, scales = "free")

准备画图数据(分组汇总):

df2 = df1 %>%
group_by(Tissue, Sample) %>%
summarise(mu = mean(value), se = sd(value))
df2

绘制复试条形图,并标记:

df2 %>%
ggplot(aes(Tissue, mu, fill = Sample)) +
geom_col(position = "dodge") +
geom_errorbar(aes(ymax = mu + se, ymin = mu - se), width = 0.15,
position = position_dodge(0.9)) +
ylim(0, 40) +
geom_segment(x = 0.7, y = 8.817302+3, xend = 0.7 , yend = 32.302470+3) +
geom_segment(x = 0.7, y = 32.302470+3, xend = 1.3, yend = 32.302470+3) +
geom_segment(x = 1.3, y = 32.302470+3, xend = 1.3, yend = 32.302470+2) +
annotate("text", x = 1, y = 32.302470 + 4, label = "***")




附录

学习全网最新的 R 语言编程技术,掌握真正的数据编程思维:

你只需要收看这份《R语言编程:基于tidyverse》完整课件!

下载地址:

链接:https://pan.baidu.com/s/1w6FDFndUuHcI8RngIOe49g?pwd=3yee

提取码:3yee

欢迎转发与推广!

本书的 电子网页版 和 纸质版预售 已上线(人邮)异步社区,可在异步社区公众号或官网购买纸质版预计1月中旬上市:

https://www.epubit.com/bookDetails?id=UB7db2c0db9f537&tabName=%E6%8A%A2%E8%AF%BB%E7%89%88&floorName=%E7%B2%BE%E9%80%89%E7%BA%B8%E4%B9%A6

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存