R语言:数据框列离散化并替换为区间均值的方法求助
实现等频离散化并回填区间均值的几种方法
我来给你分享几个能实现等频离散化并回填区间均值的实用方法,解决你之前用arules::discretize没法直接替换均值的问题~
方法1:用dplyr的ntile分组计算均值
dplyr的ntile()函数可以直接把数据分成指定数量的等频组,然后我们可以按组计算均值,再替换原列的值:
library(dplyr) # 假设你的数据框是df,要对b列做3组等频离散化 df <- df %>% mutate(b_bin = ntile(b, n = 3), # 分成3个等频组 b = ave(b, b_bin, FUN = mean)) %>% # 用组均值替换原b列 select(-b_bin) # 删掉临时的分组列
这个方法代码简洁,ntile会自动处理分组逻辑,保证每组的实例数尽可能接近(当总数量不能被组数整除时,前几组会多1个样本)。
方法2:用data.table高效处理(适合大数据)
如果你的数据量很大,data.table的分组操作效率更高,一行代码就能实现等频分箱+均值回填:
library(data.table) setDT(df) # 把普通数据框转成data.table格式 df[, b := mean(b), by = .(ntile(b, 3))] # 按3个等频组分组,用组均值替换b列
它的处理速度比dplyr更快,很适合百万级以上的大数据场景。
方法3:手动分箱(无需额外依赖)
要是你不想加载第三方包,可以手动计算分位数,用基础函数完成操作:
# 计算3个等频分位数(分成4个点,对应3个区间) quantiles <- quantile(df$b, probs = seq(0, 1, length.out = 4)) # 给每个值分配对应的组 groups <- findInterval(df$b, quantiles, rightmost.closed = TRUE) # 用组均值替换原b列 df$b <- ave(df$b, groups, FUN = mean)
这里seq(0,1,length.out=4)是因为要分成3组,需要4个分位点(0%、33.3%、66.6%、100%),findInterval会把每个值映射到对应的组里,最后用ave计算每组的均值。
验证效果
用你提到的iris$Petal.Length测试8组等频分箱的话,用dplyr的方法可以快速验证分组数量:
iris_test <- iris %>% mutate(Petal.Length_bin = ntile(Petal.Length, 8), Petal.Length = ave(Petal.Length, Petal.Length_bin, FUN = mean)) # 查看每组的样本数量 table(iris_test$Petal.Length_bin)
会得到每组数量接近的结果(150/8=18.75,所以前6组19个,后2组18个),完全符合等频分箱的要求。
内容的提问来源于stack exchange,提问作者SundayProgrammer
相关产品推荐
相关产品推荐

