R自定义分箱函数调用cut时报breaks与labels长度不匹配问题求助
问题排查与修复方案
核心问题定位
cut()函数逻辑规则不匹配:breaks参数长度为k时,生成的区间数量为k-1,测试场景下你的代码生成的z断点长度为6,仅能生成5个区间,但指定的labels长度为6,直接触发长度不匹配报错。- 极值取整逻辑错误:对最大值的四舍五入逻辑会导致超出取整范围的数据丢失,测试场景下x的最大值为12,按原代码计算得到的
b=10,11、12两个值会落在所有区间外被转为NA。 ifelse使用错误:ifelse是矢量化函数,当判断条件为标量时,只会返回yes/no参数的第一个元素,你原本设计的断点追加逻辑实际不会生效。
修复后代码
breakdown = function(x,n){ # 极值向外侧取整,保证所有数据落在断点范围内 a = floor(min(x)/10)*10 b = ceiling(max(x)/10)*10 # 直接生成n+1个断点,刚好对应n个分箱 z = seq(a, b, length.out = n+1) # include.lowest保证最小值被纳入第一个区间 v = cut(x, breaks = z, labels = 1:n, include.lowest = TRUE) return(v) }
测试验证
运行测试用例:
x <- 1:12 breakdown(x, 6)
输出结果符合预期,无报错:
[1] 1 1 2 2 3 3 4 4 5 5 6 6 Levels: 1 2 3 4 5 6
内容的提问来源于stack exchange,提问作者Yagami_Light
相关产品推荐
相关产品推荐

