如何动态展开NAICS代码的范围字符串为逗号分隔格式?
优雅实现NAICS代码范围的展开
需要将包含单个代码、逗号分隔代码和范围格式(如31-33、6114-7)的NAICS列,统一转换为全逗号分隔的展开字符串,以下是简洁易维护的实现方案:
实现代码
library(tidyverse) # 定义单个NAICS范围项的展开函数 expand_naics_range <- function(x) { # 非范围项直接返回 if (!stringr::str_detect(x, "-")) return(x) # 拆分范围的起始和后缀部分 parts <- stringr::str_split(x, "-", simplify = TRUE) start_str <- parts[1] end_suffix <- parts[2] # 计算完整的结束代码 start_len <- nchar(start_str) suffix_len <- nchar(end_suffix) end_str <- if (suffix_len < start_len) { stringr::str_c(stringr::str_sub(start_str, 1, start_len - suffix_len), end_suffix) } else { end_suffix } # 生成序列并格式化为与起始代码同长度的字符串(保留前导零) seq_num <- seq(as.integer(start_str), as.integer(end_str)) stringr::str_pad(seq_num, width = start_len, pad = "0", side = "left") } # 样本数据 data0 <- tibble::tibble("2022 NAICS" = c("31-33", "331", "332, 333", "6113", "6114-7", "6118")) # 执行展开处理 data_expanded <- data0 %>% dplyr::mutate( `Expanded NAICS` = purrr::map_chr(`2022 NAICS`, function(x) { # 拆分逗号分隔的多个项 items <- stringr::str_split(x, ",\\s+")[[1]] # 逐个展开后合并为字符串 items %>% purrr::map(expand_naics_range) %>% unlist() %>% stringr::str_c(collapse = ", ") }) ) # 查看结果 print(data_expanded)
代码说明
expand_naics_range函数:专门处理单个范围项,自动适配不同位数的范围规则:- 对于
6114-7这类短后缀范围,提取起始代码的前缀(611)拼接后缀(7)得到结束代码6117,生成序列后补全位数 - 对于
31-33这类等长范围,直接用起始和结束代码生成序列 - 保留NAICS代码的前导零格式(如
04-06会展开为04, 05, 06)
- 对于
- tidyverse链式处理:用
map_chr迭代每个单元格,拆分逗号项、逐个展开后合并,逻辑清晰易维护
输出结果
# A tibble: 6 × 2 `2022 NAICS` `Expanded NAICS` <chr> <chr> 1 31-33 31, 32, 33 2 331 331 3 332, 333 332, 333 4 6113 6113 5 6114-7 6114, 6115, 6116, 6117 6 6118 6118
内容的提问来源于stack exchange,提问作者Steven314
相关产品推荐
相关产品推荐

