如何统计diamonds数据集按价格分位数分组的样本数量
实现方案
你可以通过tidyverse工具集实现需求,以下分为两种常见场景提供可直接运行的代码:
场景1:使用全局统一的价格分位数区间
所有cut分类共用一套价格分位划分规则,适合跨cut类别对比不同价位的销量:
library(tidyverse) # 自定义分位规则,示例为四分位,改为seq(0, 1, 0.1)即为十分位,可按需调整 quantile_breaks <- quantile(diamonds$price, probs = seq(0, 1, 0.25), na.rm = TRUE) # 统计各cut分类下每个价格区间的销量 global_stat <- diamonds %>% mutate(price_range = cut(price, breaks = quantile_breaks, include.lowest = TRUE, dig.lab = 10)) %>% count(cut, price_range, name = "sales_volume") # 打印完整统计结果 print(global_stat, n = Inf)
场景2:按cut分组计算各组内的价格分位数区间
每个cut分类单独计算分位,和你绘制的lvplot分组分布对应,适合看单组内不同分位的样本量:
library(tidyverse) grouped_stat <- diamonds %>% group_by(cut) %>% mutate(price_range = cut(price, breaks = quantile(price, probs = seq(0, 1, 0.25), na.rm = TRUE), include.lowest = TRUE, dig.lab = 10)) %>% count(price_range, name = "sales_volume") %>% ungroup() # 打印完整统计结果 print(grouped_stat, n = Inf)
参数说明
probs参数:自定义分位密度,比如seq(0, 1, 0.2)就是将价格分为5个20%分位区间include.lowest = TRUE:保证价格最小值被纳入第一个区间,避免样本遗漏dig.lab = 10:避免价格区间标签显示为科学计数法,保持可读性
可选:将统计值标注到lvplot上
如果需要在原有图表上直接显示每个分位的样本量,可以添加文本标签层:
library(lvplot) # 计算标签放置的y轴位置(取每个区间的价格中位数) label_data <- grouped_stat %>% rowwise() %>% mutate(price_mid = mean(as.numeric(str_extract_all(price_range, "\\d+")[[1]]))) %>% ungroup() ggplot(diamonds, aes(x = cut, y = price)) + geom_lv() + geom_text(data = label_data, aes(label = sales_volume, y = price_mid), color = "white", size = 3, fontface = "bold") + labs(title = "Cut of Diamonds by Price")
内容的提问来源于stack exchange,提问作者Shawn Hemelstrand
相关产品推荐
相关产品推荐

