You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

关键细节解释

  1. 分组变量整合:用mutate把cut生成的AgeGroup直接加入原数据,这样dplyr就能识别这个分组字段进行后续汇总。
  2. 统计指标计算:
    • 标准误(SE):采用学界常用公式标准差 / sqrt(样本量),反映均值的抽样误差。
    • 95%置信区间:用t分布分位数qt(0.975, df=n-1)计算,比正态分布更适合小样本场景。
    • 所有统计量都加入了na.rm=TRUE,避免缺失值导致计算失败。
  3. 结果格式:保留了你接受的(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 09:43:15