使用dplyr对离散变量进行binning:每2个连续行合并为箱且以首行值命名
R离散变量按连续两行合并分箱实现方案
以下方案适用于将离散变量按每两个连续行合并为一个分箱、分箱名取分组第一行取值的需求,兼容大体积数据集。
# 官方给出的示例数据集 x <- data.frame( x = c(1,2,3,4,5,6,7,8,9,10,11,12), y = c(1,1,3,3,5,5,7,7,9,9,11,11) )
方案1:基础R实现(无需额外依赖)
# 生成每2行一组的分组ID,适配奇数总行数场景 group_id <- rep(1:(ceiling(nrow(x)/2)), each = 2, length.out = nrow(x)) # 按分组取第一行y值作为分箱名 x$bin <- ave(x$y, group_id, FUN = \(v) v[1])
方案2:dplyr实现(适合中大型数据集)
dplyr 1.1.0及以上版本可直接用.by参数实现分组操作,执行效率更高:
library(dplyr) x <- x %>% mutate( group_id = (row_number() - 1) %/% 2, bin = first(y), .by = group_id ) %>% select(-group_id) # 不需要分组ID可直接删除该列
方案3:data.table实现(适合超大规模数据集)
对体量极大的数据集,推荐用data.table实现,性能最优:
library(data.table) setDT(x) x[, bin := first(y), by = (seq_len(nrow(x)) - 1) %/% 2]
输出结果验证
三种方案最终得到的分箱结果完全一致,符合需求:
x y bin 1 1 1 1 2 2 1 1 3 3 3 3 4 4 3 3 5 5 5 5 6 6 5 5 7 7 7 7 8 8 7 7 9 9 9 9 10 10 9 9 11 11 11 11 12 12 11 11
如果仅需要对单独的离散向量做分箱,可直接用以下代码:
# vec为待分箱的离散向量 vec <- c(1,2,3,4,5,6,7,8,9,10,11,12) bin_result <- ave(vec, (seq_along(vec)-1) %/% 2, FUN = \(v) v[1])
内容的提问来源于stack exchange,提问作者Stata_user
相关产品推荐
相关产品推荐

