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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:58:24