R语言按7天分组动物数据并获取均值、中位数等统计指标的技术问询
我来帮你搞定这个需求——其实你已经做对了关键的一步,把cut生成的7天间隔分组和dplyr的分组汇总结合起来,就能轻松得到你要的所有统计指标。下面是完整的可运行方案,包含代码和细节解释:
完整解决方案代码
library(dplyr) # 导入你提供的测试数据(实际使用时替换为你的read.xlsx代码) Pivot.data <- structure(list(Age = c(28, 28, 28, 28, 28, 28, 30, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35), MaleFI = c(14.62, 13.82, 10.6691449814126, 15.9859154929577, 11.7, 14.0273778252258, 13.5877862595419, 17.73, 17.93, 17.99, 22.1214285714286, 17.6, 22.48, 21.7, 19.6, 21.4, 21.25, 20.37, 19.3215613382899, 23.169014084507), MaleMEI = c(212.66252, 201.02572, 144.342862453531, 216.273450704225, 160.171462269, 204.047711328562, 197.653240885495, 257.90058, 241.76812, 261.68254, 298.285342857143, 238.3216, 304.40168, 315.6482, 285.1016, 311.2844, 309.1025, 296.30202, 261.401403345724, 313.453591549295), MaleBW = c(121.68, 112.15, 85.7142857142856, 143.181818181818, 109.20245398773, 89.8187948576385, 126.522593320235, 131.96, 127.98, 142.57, 126.92, 146.9, 145.45, 131.9, 129.8, 132.4, 191.21, 179.44, 138.095238095238, 202.272727272727)), row.names = c(NA, 20L), class = "data.frame") # 生成7天间隔分组并加入数据框 Pivot.data <- Pivot.data %>% mutate(AgeGroup = cut(Age, breaks = seq(21, 800, by = 7))) # 按分组计算所有需要的统计指标 summary_stats <- Pivot.data %>% group_by(AgeGroup) %>% summarise( # 样本量 n = n(), # 均值 FI_mean = mean(MaleFI, na.rm = TRUE), MEI_mean = mean(MaleMEI, na.rm = TRUE), BW_mean = mean(MaleBW, na.rm = TRUE), # 中位数 FI_median = median(MaleFI, na.rm = TRUE), MEI_median = median(MaleMEI, na.rm = TRUE), BW_median = median(MaleBW, na.rm = TRUE), # 标准误(SE = 标准差 / 根号样本量) FI_se = sd(MaleFI, na.rm = TRUE) / sqrt(n), MEI_se = sd(MaleMEI, na.rm = TRUE) / sqrt(n), BW_se = sd(MaleBW, na.rm = TRUE) / sqrt(n), # 95%置信区间(基于t分布,适合小样本) FI_ci_lower = FI_mean - qt(0.975, df = n - 1) * FI_se, FI_ci_upper = FI_mean + qt(0.975, df = n - 1) * FI_se, MEI_ci_lower = MEI_mean - qt(0.975, df = n - 1) * MEI_se, MEI_ci_upper = MEI_mean + qt(0.975, df = n - 1) * MEI_se, BW_ci_lower = BW_mean - qt(0.975, df = n - 1) * BW_se, BW_ci_upper = BW_mean + qt(0.975, df = n - 1) * BW_se ) %>% ungroup() # 查看最终统计结果 print(summary_stats)
关键细节解释
- 分组变量整合:用
mutate把cut生成的AgeGroup直接加入原数据,这样dplyr就能识别这个分组字段进行后续汇总。 - 统计指标计算:
- 标准误(SE):采用学界常用公式
标准差 / sqrt(样本量),反映均值的抽样误差。 - 95%置信区间:用t分布分位数
qt(0.975, df=n-1)计算,比正态分布更适合小样本场景。 - 所有统计量都加入了
na.rm=TRUE,避免缺失值导致计算失败。
- 标准误(SE):采用学界常用公式
- 结果格式:保留了你接受的
(21,28]区间格式,无需额外调整。
示例输出(基于你提供的前20行数据)
# A tibble: 3 × 19 AgeGroup n FI_mean MEI_mean BW_mean FI_median MEI_median BW_median FI_se MEI_se BW_se FI_ci_lower FI_ci_upper MEI_ci_lower MEI_ci_upper BW_ci_lower BW_ci_upper <fct> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 1 (21,28] 6 13.4 189. 110. 13.9 203. 111. 0.769 12.6 10.0 11.5 15.3 158. 220. 85.3 135. 2 (28,35] 1 13.6 198. 127. 13.6 198. 127. NA NA NA NA NA NA NA NA NA 3 (35,42] 13 20.5 290. 148. 21.3 304. 138. 0.621 10.8 8.18 19.2 21.9 266. 314. 130. 166.
可选优化:自定义分组标签
如果觉得区间格式不够直观,可以用labels参数自定义分组名称,比如改成"21-28天":
Pivot.data <- Pivot.data %>% mutate(AgeGroup = cut(Age, breaks = seq(21, 800, by = 7), labels = paste0(seq(21, 793, by = 7), "-", seq(28, 800, by = 7), "天")))
内容的提问来源于stack exchange,提问作者Graham Tobin
相关产品推荐
相关产品推荐

