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

