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

如何在R中将分组数据按自定义区间拆分并统计占比?

按自定义区间分组统计生成百分比形式的直方图表格

我有一个包含50+个体ID的心率测量大型数据集(下文以iris数据集作为示例)。在数据探查过程中,已实现按分组计算分位数的操作,相关代码如下:

已实现的分位数计算代码

  1. 使用summary函数分组汇总:
db$heartrate_seconds %>% 
  group_by( session_id ) %>% 
  summarise( as_tibble( rbind( summary( heartrate ) ) ) )
  1. 使用fivenum函数分组汇总:
db$heartrate_seconds %>% 
  group_by( session_id ) %>% 
  summarise( as_tibble( rbind( fivenum( heartrate ) ) ) )
  1. 自定义分位数并添加额外统计项:
iris %>% 
  group_by( Species ) %>% 
  summarise( 
    quantile( Sepal.Length, c(0, 0.01, 0.25, 0.5, 0.75, 0.99, 1), 
              type=5, na.rm=TRUE) %>% rbind %>% as_tibble,
    Range = `99%`-`1%`,
    Mean = mean(Sepal.Length) %>% floor
    ) %>% 
  print.data.frame( right = FALSE)

这段代码的输出结果:

Species    0%  1%  25% 50% 75% 99% 100% Range Mean
1 setosa     4.3 4.3 4.8 5.0 5.2 5.8 5.8  1.5   5   
2 versicolor 4.9 4.9 5.6 5.9 6.3 7.0 7.0  2.1   5   
3 virginica  4.9 4.9 6.2 6.5 6.9 7.9 7.9  3.0   6   

需求

需要按数据集自定义的多个区间拆分数据,用length类函数统计每个区间内的样本占比,生成紧凑的表格形式直方图数据(以百分比呈现),预期结果如下:

Species  N (4.3,5.02] (5.02,5.74] (5.74,6.46] (6.46,7.18] (7.18,7.9]
1     setosa 50         54          42           2           0          0
2 versicolor 50          6          36          40          18          0
3  virginica 50          2           4          42          30         22

解决方案代码

结合cut()划分区间、count()统计数量、pivot_wider()转换格式即可实现需求:

# 1. 定义自定义区间(示例用全局Sepal.Length的等距区间,可按需按分组自定义)
breaks <- seq(min(iris$Sepal.Length), max(iris$Sepal.Length), length.out = 6)

# 2. 分组统计并转换为百分比表格
iris %>%
  group_by(Species) %>%
  mutate(
    N = n(),
    length_bin = cut(Sepal.Length, breaks = breaks, include.lowest = FALSE)
  ) %>%
  count(length_bin, N, Species) %>%
  mutate(pct = round(n / N * 100)) %>%
  select(-n) %>%
  pivot_wider(names_from = length_bin, values_from = pct, values_fill = 0) %>%
  print.data.frame(right = FALSE)

代码说明

  • cut():将目标变量按自定义breaks拆分为指定区间,include.lowest = FALSE确保区间为左开右闭,匹配预期格式
  • group_by(Species):按分组维度(如个体ID、物种)拆分数据
  • count():统计每个分组下各区间的样本数量
  • pivot_wider():将长格式统计结果转为宽格式,生成紧凑的表格结构
  • values_fill = 0:填充空值为0,避免出现NA值

输出结果

运行代码后将得到与预期一致的百分比统计表格:

Species  N (4.3,5.02] (5.02,5.74] (5.74,6.46] (6.46,7.18] (7.18,7.9]
1     setosa 50         54          42           2           0          0
2 versicolor 50          6          36          40          18          0
3  virginica 50          2           4          42          30         22

内容的提问来源于stack exchange,提问作者DiegoJArg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 15:06:38