如何在R中将分组数据按自定义区间拆分并统计占比?
按自定义区间分组统计生成百分比形式的直方图表格
我有一个包含50+个体ID的心率测量大型数据集(下文以iris数据集作为示例)。在数据探查过程中,已实现按分组计算分位数的操作,相关代码如下:
已实现的分位数计算代码
- 使用
summary函数分组汇总:
db$heartrate_seconds %>% group_by( session_id ) %>% summarise( as_tibble( rbind( summary( heartrate ) ) ) )
- 使用
fivenum函数分组汇总:
db$heartrate_seconds %>% group_by( session_id ) %>% summarise( as_tibble( rbind( fivenum( heartrate ) ) ) )
- 自定义分位数并添加额外统计项:
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
相关产品推荐
相关产品推荐

