R语言中如何通过cut函数自定义分组区间,生成目标分组用于箱线图?
解决R语言
cut()分组区间标签调整问题 你当前用cut(60:95, breaks = c(60,64,68,72,76,80,85,90,95))得到的区间是连续左端点形式(比如(64,68]),但你希望后续区间是(65,68]、(69,72]这类左端点比前一个区间右端点大1的样式。其实对于整数数据来说,(64,68]这个区间实际包含的就是65-68的数值,和你期望的(65,68]范围完全一致——只是标签写法不同。下面分两种情况给出解决方案:
情况1:仅需要修改区间显示标签(推荐)
如果只是想让分组标签显示成你想要的样式,不需要改变实际的分组逻辑,直接自定义labels参数即可:
# 你的原始数据向量 x <- 60:95 # 保留你原来的断点设置 breaks <- c(60, 64, 68, 72, 76, 80, 85, 90, 95) # 定义你期望的区间标签 custom_labels <- c( "(60,64]", "(65,68]", "(69,72]", "(73,76]", "(77,80]", "(81,85]", "(86,90]", "(91,95]" ) # 执行分组并应用自定义标签 grouped_data <- cut(x, breaks = breaks, labels = custom_labels) # 验证前8个结果 head(grouped_data, 8)
运行后输出的前8个结果是:
[1] <NA> (60,64] (60,64] (60,64] (60,64] (65,68] (65,68] (65,68] Levels: (60,64] (65,68] (69,72] (73,76] (77,80] (81,85] (86,90] (91,95]
注:60会被标记为<NA>,因为你的第一个区间是(60,64](左开右闭,不包含60)。如果想把60包含进去,可以把breaks的第一个值改成59,或者添加include.lowest = TRUE参数。
情况2:需要真正调整分组逻辑(不推荐,除非必要)
如果你确实需要让区间的左边界严格从65、69等开始(比如排除64进入下一个区间),可以定义非连续的断点序列:
# 定义非连续断点,每个区间左端点比前一个区间右端点大1 breaks_custom <- c(60, 64, 65, 68, 69, 72, 73, 76, 77, 80, 81, 85, 86, 90, 91, 95) # 执行分组,保持左开右闭的规则 grouped_data_custom <- cut(x, breaks = breaks_custom, right = TRUE) # 查看每个区间的计数 table(grouped_data_custom)
不过这种方法会产生空区间(比如(64,65]没有任何数值),后续绘制箱线图时需要额外过滤这些空区间,所以更推荐第一种方法。
内容的提问来源于stack exchange,提问作者Rob John




