R语言:基于分组数值范围用rep()循环填充新列Type的方法
解决方案
要实现根据分组对应的数值范围循环填充新列,且支持任意数量分组的通用方案,可按以下步骤操作:
步骤1:构建分组-范围映射表并解析数值序列
首先将分组对应的范围字符串(如"2-4")转换为可循环使用的数值序列:
library(dplyr) library(stringr) library(purrr) # 定义分组与范围的映射关系 range_map <- data.frame( Group = c("A", "B", "C"), Range = c("2-4", "6-8", "10-12") ) %>% mutate( # 提取范围的起始和结束数值 start = as.integer(str_extract(Range, "^\\d+")), end = as.integer(str_extract(Range, "\\d+$")), # 生成对应的数值序列 type_seq = map2(start, end, ~.x:.y) ) %>% select(Group, type_seq) # 保留需要的列
步骤2:关联原始数据并生成循环填充的Type列
将映射表与原始数据关联,按分组循环生成Type值:
# 原始数据框 df <- data.frame(Group = rep(c("A", "B", "C"), times = c(2, 4, 6))) # 生成目标数据框 df2 <- df %>% left_join(range_map, by = "Group") %>% group_by(Group) %>% mutate( # 按当前组的行数循环填充数值序列 Type = rep_len(unlist(type_seq), n()) ) %>% select(-type_seq) %>% # 移除临时列 ungroup() # 查看结果 print(df2)
运行后将得到预期输出:
Group Type 1 A 2 2 A 3 3 B 6 4 B 7 5 B 8 6 B 6 7 C 10 8 C 11 9 C 12 10 C 10 11 C 11 12 C 12
方案优势
- 扩展性强:新增分组时,只需在
range_map中添加对应的Group和Range即可,无需修改核心逻辑 - 避免硬编码:无需逐个判断分组,通用适配所有分组场景
内容的提问来源于stack exchange,提问作者Prahara
相关产品推荐
相关产品推荐

