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

如何将连续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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 07:05:34