R语言如何使用cut()函数创建从0起始的数据分组断点
R语言
cut()函数设置从0起始分组断点的方法 问题原因
当给cut()传入单个整数作为breaks参数时,R会自动计算覆盖全部数据范围的等距区间,为了确保数据最小值能被纳入区间,会自动在数据最小值外侧预留一小段偏移量,这就是运行测试代码时首个区间下限出现负数、没有从0开始的原因。
解决方法
方法1:手动指定完整断点向量
不要传入单个分组数让R自动计算断点,直接生成从0开始的完整断点序列传入即可,注意搭配include.lowest = TRUE参数,保证等于0的最小值能被纳入第一个区间(默认区间为左开右闭(a,b],不加该参数时0会因为不满足>0的判定被记为NA)。
示例代码:
x <- seq(0, 102, length.out = 15) # 生成长度为11的断点序列,对应10个分组,起点固定为0 breaks <- seq(from = 0, to = max(x), length.out = 11) cut(x, breaks = breaks, include.lowest = TRUE)
运行结果如下,首个区间从0开始:
[1] [0,10.2] [0,10.2] (10.2,20.4] (20.4,30.6] (20.4,30.6] (30.6,40.8] (40.8,51] (40.8,51] (51,61.2] (61.2,71.4] (71.4,81.6] (71.4,81.6] [13] (81.6,91.8] (91.8,102] (91.8,102] Levels: [0,10.2] (10.2,20.4] (20.4,30.6] (30.6,40.8] (40.8,51] (51,61.2] (61.2,71.4] (71.4,81.6] (81.6,91.8] (91.8,102]
方法2:修正自动生成的断点
如果不想手动计算区间步长,可以先让R生成默认断点,再把第一个断点替换为0:
x <- seq(0, 102, length.out = 15) # 生成默认等距断点 breaks <- seq(min(x), max(x), length.out = 11) # 替换起始断点为0 breaks[1] <- 0 cut(x, breaks = breaks, include.lowest = TRUE)
注意事项
- 如果数据中存在小于0的数值,将断点起点固定为0后,这部分值会被判定为
NA,需要根据数据实际情况调整断点范围。 - 如果习惯使用左闭右开的区间格式,可以设置参数
right = FALSE,此时区间格式为[a,b),不需要额外加include.lowest = TRUE就能把0值纳入第一个区间。
内容的提问来源于stack exchange,提问作者zimia
相关产品推荐
相关产品推荐

