如何扩展grepl多条件匹配,实现SIC编码到文字分类的转换?
问题描述
我有一个如下结构的数据框:
tibble [9 x 2] (S3: tbl_df/tbl/data.frame) $ Date: chr [1:9] "Tuesday 4 October 2022" "Wednesday 5 October 2022" "Thursday 6 October 2022" "Friday 7 October 2022:" $ SIC : chr [1:9] "01500" "01610" "01629" "01630"
我希望通过grepl将'SIC'列转换为对应的文字分类,生成名为"Type"的新列,对应关系如下:
- 01500 = "Mixed farming"
- 01610 = "Support activities for crop production"
- 01629 = " Support activities for animal production (other than farm animal boarding and care) n.e.c."
- 01630 = "Post-harvest crop activities"
目前我只实现了单条件匹配:
df$Type <- ifelse(grepl("01500", df$SIC), "Mixed farming", "Other")
这段代码只能处理单个情况,请问该如何扩展以支持更多条件?
解决方法
方法1:嵌套ifelse
直接嵌套多个ifelse依次匹配条件,适合条件数量较少的场景:
df$Type <- ifelse(grepl("01500", df$SIC), "Mixed farming", ifelse(grepl("01610", df$SIC), "Support activities for crop production", ifelse(grepl("01629", df$SIC), " Support activities for animal production (other than farm animal boarding and care) n.e.c.", ifelse(grepl("01630", df$SIC), "Post-harvest crop activities", "Other"))))
注:如果你的SIC列是精确编码(无多余字符),用df$SIC == "01500"这种精确匹配的效率会比grepl更高。
方法2:使用dplyr::case_when(推荐)
如果用tidyverse工具链,case_when的语法更清晰,可读性更强:
library(dplyr) df <- df %>% mutate(Type = case_when( grepl("01500", SIC) ~ "Mixed farming", grepl("01610", SIC) ~ "Support activities for crop production", grepl("01629", SIC) ~ " Support activities for animal production (other than farm animal boarding and care) n.e.c.", grepl("01630", SIC) ~ "Post-harvest crop activities", TRUE ~ "Other" # 匹配不到的情况统一归为Other ))
方法3:构建匹配表关联(更易维护)
如果后续需要添加更多SIC编码对应关系,建议先做一个匹配表,再通过left_join关联,方便后续管理:
library(dplyr) # 构建SIC与分类的匹配表 sic_mapping <- tibble( SIC = c("01500", "01610", "01629", "01630"), Type = c("Mixed farming", "Support activities for crop production", " Support activities for animal production (other than farm animal boarding and care) n.e.c.", "Post-harvest crop activities") ) # 关联匹配表生成Type列 df <- df %>% left_join(sic_mapping, by = "SIC") %>% mutate(Type = ifelse(is.na(Type), "Other", Type)) # 未匹配到的编码设为Other
这种方法的优势是,后续新增或修改编码对应关系时,只需要调整sic_mapping表,无需修改逻辑代码,适合编码数量较多的场景。
内容的提问来源于stack exchange,提问作者alec22
相关产品推荐
相关产品推荐

