如何将连续N个分组合并为单个分组(R语言tibble场景)
问题:将连续N个原分组合并为新分组
我有一个包含8个分组的tibble:
df <- structure(list(group1 = c(1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 5, 6, 6, 7, 8, 8)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -16L))
数据预览:
group1 <dbl> 1 1 2 1 3 2 4 2 5 3 6 3 7 4 8 4 9 5 10 5 11 5 12 6 13 6 14 7 15 8 16 8
需要创建新列group2,将每连续N个(例如N=2)原分组合并为一个新分组,最终结果如下:
group1 group2 <dbl> <dbl> 1 1 1 2 1 1 3 2 1 4 2 1 5 3 2 6 3 2 7 4 2 8 4 2 9 5 3 10 5 3 11 5 3 12 6 3 13 6 3 14 7 4 15 8 4 16 8 4
背景说明:如果是针对行做类似分组,我会用以下代码:
df %>% mutate(Col2 = rep(row_number(), each=2, length.out = n()))
但现在需要把逻辑替换为基于原分组的合并。
解决方案
方法一:通过分组映射表关联
先提取唯一的原分组,给每N个连续分组分配新编号,再关联回原数据:
library(dplyr) N <- 2 # 设定每N个原分组合并为一组 # 生成分组映射关系 group_mapping <- df %>% distinct(group1) %>% # 获取所有唯一的原分组 mutate(group2 = rep(seq_len(ceiling(n()/N)), each=N, length.out=n())) # 将映射关系合并到原数据 df_result <- df %>% left_join(group_mapping, by = "group1")
方法二:直接生成分组编号(更简洁)
先给每个唯一原分组分配连续ID,再通过整除向上取整得到新分组:
library(dplyr) N <- 2 df_result <- df %>% # 给每个唯一的group1分配从1开始的连续ID mutate(unique_group_id = match(group1, unique(group1))) %>% # 每N个连续ID合并为一个group2 mutate(group2 = ceiling(unique_group_id / N)) %>% # 移除中间辅助列 select(-unique_group_id)
两种方法都能得到目标结果,方法二更高效,无需额外的关联操作。
内容的提问来源于stack exchange,提问作者TarJae
相关产品推荐
相关产品推荐

