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

编写data.table分组函数:按预测结果分20组并计算均值差

没问题,我来帮你搞定这个需求!下面是基于data.table的完整实现方案,从模拟数据到最终计算一步到位:

1. 先准备模拟样本数据

咱们先造一份符合要求的样本数据,方便你直接测试代码:

library(data.table)

# 生成1000条模拟数据,设置随机种子保证结果可复现
set.seed(123)
dt <- data.table(
  pred_exp = rnorm(1000, mean = 500, sd = 100), # 预测支出,模拟正态分布数据
  dummy = sample(c(0,1), 1000, replace = TRUE), # 0/1二分类dummy变量
  actual_outcome = rnorm(1000, mean = 100, sd = 20) + 0.3*pred_exp + 15*dummy # 观测结果,和预测支出、dummy相关
)
2. 按预测支出分20个升序分组

要实现类似ggplot::cut_number的等频分组(每组5%,组1为最低值组),有两种常用方法:

方法一:依赖dplyr的ntile函数

ntile()可以直接把数据按指定列分成n个等规模的升序组,用法很简单:

# 如果没装dplyr先安装:install.packages("dplyr")
library(dplyr)
dt[, group := ntile(pred_exp, 20)]

方法二:不依赖外部包,用分位数实现

如果你不想额外安装dplyr,可以直接用data.table结合分位数函数来实现:

# 基于分位数生成20个分组,组1对应最低的5%数据
dt[, group := as.integer(cut(pred_exp, 
                             breaks = quantile(pred_exp, seq(0, 1, 0.05)), 
                             include.lowest = TRUE))]

这里quantile(pred_exp, seq(0,1,0.05))会生成0%、5%、10%...100%的分位点,cut函数把数据按这些分位点拆分,include.lowest=TRUE确保最小的观测值被正确分到组1。

3. 分组计算dummy=0和1的观测结果均值差

接下来咱们按分组group聚合,计算每组内dummy=1的观测结果均值减去dummy=0的均值(你可以根据需求调整减法顺序):

# 分组计算均值差
result <- dt[, .(
  mean_diff = mean(actual_outcome[dummy == 1]) - mean(actual_outcome[dummy == 0])
), by = group]

# 按group升序排列(默认就是,但显式排序更稳妥)
setorder(result, group)

# 查看最终结果
print(result)
补充注意事项
  • 如果你的数据中某组可能没有dummy=0或dummy=1的观测值,mean()会返回NA,你可以添加na.rm=TRUE忽略缺失值,或者提前过滤这类分组:
# 过滤掉缺少dummy=0或1的组,同时忽略均值计算中的NA
result_clean <- dt[, {
  mean_dummy1 <- mean(actual_outcome[dummy == 1], na.rm = TRUE)
  mean_dummy0 <- mean(actual_outcome[dummy == 0], na.rm = TRUE)
  # 只有当两个均值都存在时才保留该组
  if (!is.na(mean_dummy1) & !is.na(mean_dummy0)) {
    .(mean_diff = mean_dummy1 - mean_dummy0)
  }
}, by = group]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:10:56