如何在R中展开数据框CodeRange列的向量型值并新增列?
在R中展开代码范围为单个代码的实现方法
嘿,这事儿不难搞定!我来给你一步步演示怎么把CodeRange里的范围值展开成单个Codes,同时保留对应的Desc信息。
首先,咱们先模拟一下你提到的样例数据框:
library(tibble) # 构造示例数据 df <- tibble( CodeRange = c("61000:61055", "0356T:0358T", "99201:99203"), Desc = c("内科相关代码", "影像技术代码", "门诊就诊代码") )
接下来,我们需要写一个小函数来处理不同类型的范围——不管是纯数字范围,还是像0356T:0358T这种带后缀字母的代码范围:
expand_code_range <- function(range_str) { # 把范围字符串按冒号分割成起始和结束值 range_parts <- strsplit(range_str, ":")[[1]] start_val <- range_parts[1] end_val <- range_parts[2] # 先判断是不是纯数字范围 if (grepl("^\\d+$", start_val) && grepl("^\\d+$", end_val)) { # 纯数字的话,直接生成连续序列再转成字符 as.character(seq(as.integer(start_val), as.integer(end_val), by = 1)) } else { # 带字母的情况:提取数字部分和字母后缀 start_num <- as.integer(gsub("[^0-9]", "", start_val)) end_num <- as.integer(gsub("[^0-9]", "", end_val)) code_suffix <- gsub("[0-9]", "", start_val) # 假设前后后缀一致 # 生成数字序列后拼接字母 paste0(seq(start_num, end_num, by = 1), code_suffix) } }
有了这个函数,咱们就可以用tidyverse工具链来展开数据了:
library(dplyr) library(tidyr) library(purrr) # 展开范围并生成最终数据框 df_expanded <- df %>% mutate(Codes = map(CodeRange, expand_code_range)) %>% # 把每个范围转成单个代码的列表 unnest(Codes) # 把列表展开成多行
运行完之后,你就能得到期望的结果啦!比如61000:61055会被展开成从61000到61055的每一个数字,0356T:0358T会变成0356T、0357T、0358T,每个代码都对应原来的Desc。
如果你的数据里还有其他特殊格式的范围(比如前缀字母不同),可以稍微调整expand_code_range函数的逻辑,但这个版本已经能覆盖你提到的典型场景啦。
内容的提问来源于stack exchange,提问作者TOTX
相关产品推荐
相关产品推荐

