编写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
相关产品推荐
相关产品推荐

