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

如何为R数据框中多列重复组合的行统一分配组编号?

为分组组合分配统一组编号的解决方案

原始数据框

df <- data.frame(
  id = c(1L,1L,1L,2L,2L,2L,3L,3L),
  groupA = c("A","A","B","B","B","B","A","A"),
  groupB = c("red", "red", "red", "blue", "red", "blue", "blue", "red")
)

期望输出

我们需要为每个id下的唯一(groupA, groupB)组合分配统一的递增编号,最终输出如下:

id groupA groupB nr.group
1  1      A    red      1
2  1      A    red      1
3  1      B    red      2
4  2      B   blue      1
5  2      B    red      2
6  2      B   blue      1
7  3      A   blue      1
8  3      A    red      2

原代码问题

原代码通过group_by(id, groupA, groupB)后使用mutate(nr.group = 1:n()),只会对每个分组内的行进行逐行计数,无法实现为同一组合分配统一编号的需求。


解决方案1:使用dplyr包

核心思路是按id分组,对每个id内的(groupA, groupB)组合生成唯一编号:

library(dplyr)

# 方法1:用cur_group_id直接生成分组编号
df %>%
  group_by(id, groupA, groupB) %>%
  mutate(nr.group = cur_group_id()) %>%
  group_by(id) %>%
  mutate(nr.group = dense_rank(nr.group)) %>%
  ungroup()

# 方法2:先创建组合列再转因子生成编号
df %>%
  group_by(id) %>%
  mutate(comb = paste(groupA, groupB, sep = "_"),
         nr.group = as.integer(factor(comb, levels = unique(comb)))) %>%
  select(-comb) %>%
  ungroup()

两种写法均能实现:在每个id分组内,首次出现的(groupA, groupB)组合编号为1,后续新组合依次递增,同一组合保持相同编号。


解决方案2:使用基础R

利用ave()函数结合factor()实现分组内的编号分配:

df$nr.group <- with(df, 
                    ave(paste(groupA, groupB, sep = "_"), 
                        id, 
                        FUN = function(x) as.integer(factor(x, levels = unique(x)))))

原理:先将groupA和groupB拼接成组合字符串,再按id分组,对每组内的组合字符串转换为因子(按出现顺序设置水平),最后转为整数得到编号。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 23:54:05