如何重复数据框行并为每行分配列表中的唯一零件编号
模型行重复与零件编号分配解决方案
首先加载示例数据和零件编号列表:
# 示例数据集 d <- structure(list(ID = 8735:8743, Model = c("Model_A", "Model_B", "Model_C", "Model_D", "Model_E", "Model_F", "Model_G", "Model_H", "Model_I"), Part_Num = rep(NA_character_, 9)), row.names = 8615:8623, class = "data.frame") # 零件编号(转成向量更方便操作) parts <- c(1234, 1235, 1236, 1237, 1238, 1239, 1230, 1231, 1232, 1233)
核心思路
- 拆分数据:把需要处理的模型(Model_A~D)和其他模型分开
- 扩展目标行:将每个目标模型的行重复10次,同时分配对应的零件编号
- 解决ID重复:生成唯一标识区分重复行
- 合并数据:将处理后的行与原始未处理数据合并
方法一:用tidyverse工具链(推荐)
先加载必要的包:
library(dplyr) library(tidyr)
执行处理:
# 定义需要处理的模型列表 target_models <- c("Model_A", "Model_B", "Model_C", "Model_D") # 拆分数据 target_data <- d %>% filter(Model %in% target_models) other_data <- d %>% filter(!Model %in% target_models) # 扩展行并分配零件编号,同时生成唯一ID expanded_target <- target_data %>% slice(rep(1:n(), each = length(parts))) %>% # 每行重复10次 group_by(ID, Model) %>% mutate(Part_Num = parts, Unique_ID = paste0(ID, "_", Part_Num)) %>% # 用原ID+零件号做唯一标识 ungroup() # 合并所有数据 final_data <- bind_rows(other_data, expanded_target)
方法二:用base R实现
如果不想加载额外包,可用基础R代码:
# 定义目标模型 target_models <- c("Model_A", "Model_B", "Model_C", "Model_D") # 拆分数据 target_idx <- d$Model %in% target_models target_data <- d[target_idx, ] other_data <- d[!target_idx, ] # 扩展行并分配零件编号 expanded_target <- target_data[rep(1:nrow(target_data), each = 10), ] expanded_target$Part_Num <- rep(parts, nrow(target_data)) # 生成唯一ID expanded_target$Unique_ID <- paste0(expanded_target$ID, "_", expanded_target$Part_Num) # 合并数据 final_data <- rbind(other_data, expanded_target)
关键说明
- 重复行操作通过
rep()实现,确保每个目标模型的行被复制10次 - 零件编号按模型分组批量赋值,保证每个模型对应完整的10个零件号
Unique_ID列解决原ID重复问题,也可替换为自增序号(如expanded_target$Unique_ID <- 1:nrow(expanded_target)),只要能区分重复行即可- 代码可重复执行,若需避免重复处理,可先过滤掉已分配
Part_Num的行
内容的提问来源于stack exchange,提问作者KLB
相关产品推荐
相关产品推荐

