如何使用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
相关产品推荐
相关产品推荐

