如何在R中按非等宽分箱对年度股票市值分组?
解决R语言非等宽市值分组问题
嘿,我懂你的需求啦——你要的是非等比例的分箱分组,而不是ntile()默认的三等分(每组约33%)。别担心,用dplyr就能轻松实现按年度把股票市值分成前30%、中间40%、后30%的需求,下面给你两种实用的方法:
方法一:用quantile() + case_when() 精准判断区间
这种方法逻辑清晰,容易理解,适合新手调试:
library(dplyr) # 假设你的数据框名为data,包含year(年度)和ME(市值)列 data <- data %>% group_by(year) %>% mutate( # 计算每年市值的30%和70%分位数(处理缺失值用na.rm=TRUE) p30 = quantile(ME, 0.3, na.rm = TRUE), p70 = quantile(ME, 0.7, na.rm = TRUE), # 根据分位数判断分组:前30%为组1,中间40%为组2,后30%为组3 SizeGrp = case_when( ME >= p70 ~ 1, # 70分位数及以上属于前30% ME >= p30 ~ 2, # 30到70分位数之间属于中间40% TRUE ~ 3 # 剩下的属于后30% ) ) %>% select(-p30, -p70) %>% # 移除临时计算的分位数辅助列 ungroup()
方法二:用cut() 快速生成分组
如果你喜欢更简洁的代码,可以用cut()函数直接指定分箱断点:
data <- data %>% group_by(year) %>% mutate( SizeGrp = cut(ME, # 设置分箱断点:0%、30%、70%、100%分位数 breaks = quantile(ME, c(0, 0.3, 0.7, 1), na.rm = TRUE), # 对应断点的分组标签:后30%→3,中间40%→2,前30%→1 labels = c(3, 2, 1), # 确保最小值被包含在第一个区间里 include.lowest = TRUE) %>% as.integer() # 把因子类型转换成整数,和方法一的结果格式统一 ) %>% ungroup()
小提示:处理重复值与分位数计算
如果你的市值数据有大量重复值,quantile()的type参数会影响分位数的计算结果(默认是type=7)。你可以根据需求调整,比如用type=1来取最接近的实际观测值,避免出现不在数据中的分位数:
quantile(ME, 0.3, na.rm = TRUE, type = 1)
内容的提问来源于stack exchange,提问作者Ashutosh Bhaskar
相关产品推荐
相关产品推荐

