R语言dataframe如何按problem分组为多item组分配连续序号
R语言实现分组顺序编号方案
核心实现逻辑
- 先按
problem字段分组,统计每个分组下的item条目总数 - 筛选出条目数大于1的有效分组,按照分组在原数据中首次出现的顺序生成从1开始的连续编号
- 单条目分组直接赋值
NA,编号过程自动跳过这些分组,不占用序号位 - 按需调整
problem字段的展示格式,和预期输出对齐
dplyr 实现(代码可读性高)
library(dplyr) # 示例输入数据 df1 <- data.frame(problem = c(1,1,2,3,3,3,4), item = c("a1","a2","a3","b1","b2","b11","c1")) df2 <- df1 %>% group_by(problem) %>% # 统计组内条目数,记录原始分组顺序 mutate(item_cnt = n(), raw_group_id = cur_group_id()) %>% ungroup() %>% mutate( # 标记多item的有效分组 valid_id = ifelse(item_cnt > 1, raw_group_id, NA), # 将有效分组的原始ID映射为连续序号 assign = match(valid_id, sort(unique(na.omit(valid_id)))), # 调整problem字段格式 problem = paste("Problem", problem) ) %>% select(problem, item, assign)
运行后输出结果和预期完全一致:
> df2 # A tibble: 7 × 3 problem item assign <chr> <chr> <int> 1 Problem 1 a1 1 2 Problem 1 a2 1 3 Problem 2 a3 NA 4 Problem 3 b1 2 5 Problem 3 b2 2 6 Problem 3 b11 2 7 Problem 4 c1 NA
Base R 实现(无第三方依赖)
不需要加载任何扩展包,原生R代码即可完成需求:
# 示例输入数据 df1 <- data.frame(problem = c(1,1,2,3,3,3,4), item = c("a1","a2","a3","b1","b2","b11","c1")) # 统计每个分组的条目数 group_count <- table(df1$problem) # 提取多item分组,按出现顺序生成连续编号 multi_item_groups <- names(group_count[group_count > 1]) group_index <- setNames(seq_along(multi_item_groups), multi_item_groups) # 生成结果表 df2 <- df1 df2$assign <- as.numeric(group_index[as.character(df2$problem)]) df2$problem <- paste("Problem", df2$problem)
内容的提问来源于stack exchange,提问作者amisos55
相关产品推荐
相关产品推荐

