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

如何使用R按组将连续编号两两分组为集合?

问题需求

需要将每个分组g内的计数器a按每两个连续数值分为一个集合:a=1、2对应set=1,a=3、4对应set=2,a=5、6对应set=3,以此类推,实现任意a值下的set值计算。

错误尝试及结果

之前使用cumsum结合dplyr::group_by()的方法不符合需求,错误代码及输出如下:

df <- df %>% group_by(g) %>% mutate(set = cumsum(a))

输出结果:

g         a   set
   <chr> <dbl> <dbl>
 1 a         1     1
 2 a         2     3
 3 b         1     1
 4 b         2     3
 5 c         1     1
 6 c         2     3
 7 c         3     6
 8 c         4    10
 9 d         1     1
10 d         2     3
11 e         1     1
12 e         2     3
13 e         3     6
14 e         4    10
15 e         5    15
16 e         6    21
正确实现方法

可以利用取整函数实现需求,在dplyr分组后,通过以下两种方式计算set值,结果完全一致:

方法1:使用ceiling()

library(dplyr)

df <- df %>% 
  group_by(g) %>% 
  mutate(set = ceiling(a / 2)) %>% 
  ungroup()

方法2:使用floor()

df <- df %>% 
  group_by(g) %>% 
  mutate(set = floor((a + 1) / 2)) %>% 
  ungroup()

执行后得到正确结果:

g a set
1  a 1 1
2  a 2 1
3  b 1 1
4  b 2 1
5  c 1 1
6  c 2 1
7  c 3 2
8  c 4 2
9  d 1 1
10 d 2 1
11 e 1 1
12 e 2 1
13 e 3 2
14 e 4 2
15 e 5 3
16 e 6 3

原理说明

  • ceiling(a/2):将a除以2后向上取整,刚好把连续两个数值归为同一个set编号
  • floor((a+1)/2):给a加1后向下取整,同样实现每两个数一组的分组逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 00:07:42