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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 20:09:03