R语言特定条件下数值ID还原为原始字符ID的实现方法咨询
实现思路
你可以按以下逻辑处理:
- 首先拆分id列的内容,提取两部分:前两位的前缀部分、最后1位的后缀数字
- 判断前缀是否属于指定的
items = c(12,13,15)集合:- 属于该集合的,将末尾的1/2/3分别替换为
_B/_C/_D,再和前缀拼接成原始字符格式id - 不属于该集合的,直接保留原始id值即可
- 属于该集合的,将末尾的1/2/3分别替换为
- 其余列保持不变,输出最终数据集
代码实现
方法1:tidyverse 实现(代码简洁易读)
library(tidyverse) items <- c(12,13,15) # 后缀映射表 suffix_map <- c("1" = "_B", "2" = "_C", "3" = "_D") df.3 <- df.2 %>% mutate( # 提取前两位前缀 prefix = str_extract(id, "^\\d{2}"), # 提取末尾1位 last_digit = str_sub(id, -1), # 按规则重构id id = case_when( prefix %in% as.character(items) & last_digit %in% names(suffix_map) ~ paste0(prefix, suffix_map[last_digit]), TRUE ~ id ) ) %>% # 删除中间辅助列 select(-prefix, -last_digit)
方法2:base R 实现(无需额外加载依赖包)
items <- c(12,13,15) suffix_map <- c("1" = "_B", "2" = "_C", "3" = "_D") df.3 <- df.2 for (i in seq_len(nrow(df.3))) { id_val <- df.3$id[i] prefix <- substr(id_val, 1, 2) last_digit <- substr(id_val, nchar(id_val), nchar(id_val)) if (prefix %in% as.character(items) && last_digit %in% names(suffix_map)) { df.3$id[i] <- paste0(prefix, suffix_map[last_digit]) } }
两种方法运行后得到的df.3都和你给出的预期结果完全一致,且兼容后续出现15前缀的id场景。
内容的提问来源于stack exchange,提问作者amisos55
相关产品推荐
相关产品推荐

