You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

data.table按prod分组执行cut函数异常问题求助

问题分析与解决办法

问题原因

你遇到的这个问题其实是data.table分组操作里cut()函数的一个容易踩的坑:当你在by=prod的分组中直接使用cut(count, 8, ...)时,cut()会先基于整个数据集的count列计算全局分组断点(breaks),再把这些全局断点套用到每个分组上,而不是让每个分组独立计算自己的断点并分成8组。

从你的输出就能明显看出来:prod='a'的count都在30万区间,但生成的id区间却是50万级的——这就是因为全局断点包含了prod='b'的50万数据,导致prod='a'的数值被强行映射到全局断点的低区间,但显示的是全局断点的区间标签,完全不符合分组内的预期。

解决办法

要实现每个分组独立按自身数据范围分成8组,我们需要在分组内手动计算专属的断点,再执行cut()操作。具体代码如下:

library(data.table)
db <- data.frame(count=c(331948, 334999, 321000, 305000, 324100, 310000, 305000, 325000, 305000, 329999, 315000,531948, 534999, 521000, 505000, 524100, 510000, 505000, 525000, 505000, 529999, 515000), prod=c("a","a","a","a","a","a","a","a","a","a","a","b","b","b","b","b","b","b","b","b","b","b"))
setDT(db)

# 分组内计算断点后再执行cut
db[, id := {
  # 生成当前分组的等距断点(8组需要9个断点)
  group_breaks <- seq(min(count), max(count), length.out = 9)
  cut(count, breaks = group_breaks, digits=1, dig.lab = 7)
}, by = prod]

验证结果

执行上述代码后,查看prod='a'的结果:

table(db[prod=='a', id])

输出会和你单独执行cut(db[db$prod=='a',]$count,8,digits=1,dig.lab = 7)的结果完全一致:

(304970,308749.9] (308749.9,312499.8] (312499.8,316249.6] (316249.6,319999.5] (319999.5,323749.4] (323749.4,327499.2] (327499.2,331249.1] (331249.1,335029] 
                3                 1                 1                 0                 1                 2                 1                 2 

补充说明

如果你需要的是分位数分组(而非等距分组),只需把生成断点的代码换成基于分组内分位数的计算即可,比如:

group_breaks <- quantile(count, seq(0, 1, length.out = 9))

内容的提问来源于stack exchange,提问作者lolo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:16:06