R语言:将关联同一编码的多文本值列重新编码
解决员工班次重新编码的问题
我明白你现在在处理员工班次编码时遇到的麻烦——从杂乱的文本里提取班次信息,还得让stringr和dplyr配合顺畅,确实容易卡壳。你之前的代码问题主要出在str_match()的返回值上:它不会返回布尔值,而是返回匹配到的文本(或者NA),而基础的if语句只能处理单个逻辑值,没法应对整个数据列的向量操作。下面给你几个实用的解决方案:
方法一:用str_detect() + ifelse()(快速处理二分类情况)
str_detect()是stringr里专门用来判断文本是否包含目标模式的函数,它会返回一个和输入列等长的布尔向量,刚好适合向量化的条件判断。结合ifelse()(注意不是基础的if)就能轻松生成班次列:
# 先加载需要的包 library(dplyr) library(stringr) # 用mutate修改数据(推荐这种tidyverse风格,避免直接修改原数据框) Data <- Data %>% mutate(Shift = ifelse( str_detect(Unit, regex("first", ignore_case = TRUE)), "First Shift", "Lame" # 这里可以换成你需要的默认值,比如"Unknown" ))
方法二:用case_when()处理多班次场景(更灵活)
如果以后需要扩展到中班、晚班等更多情况,case_when()会比嵌套ifelse清晰太多,它能按顺序匹配多个条件:
Data <- Data %>% mutate(Shift = case_when( # 匹配包含first的文本,忽略大小写 str_detect(Unit, regex("first", ignore_case = TRUE)) ~ "First Shift", # 匹配second或者2nd的变体 str_detect(Unit, regex("second|2nd", ignore_case = TRUE)) ~ "Second Shift", # 匹配night或者third的情况 str_detect(Unit, regex("night|third|3rd", ignore_case = TRUE)) ~ "Night Shift", # 所有不匹配的情况都归为Unknown TRUE ~ "Unknown" ))
方法三:提取关键词后用recode()编码
如果你的Unit列里有明确的班次关键词,也可以先提取关键词,再用recode()统一编码,这种方式适合关键词比较固定的场景:
Data <- Data %>% # 先提取班次关键词,支持多种变体 mutate(Shift_keyword = str_extract(Unit, regex("first|1st|second|2nd|third|3rd|night", ignore_case = TRUE)), # 统一转成小写,避免大小写不匹配 Shift_keyword = str_to_lower(Shift_keyword), # 用recode把关键词映射成标准班次名称 Shift = recode( Shift_keyword, "first" = "First Shift", "1st" = "First Shift", "second" = "Second Shift", "2nd" = "Second Shift", "third" = "Third Shift", "3rd" = "Third Shift", "night" = "Night Shift", # 默认值处理未匹配的情况 .default = "Unknown" ))
几个小提醒:
- 尽量用
dplyr::mutate()来修改数据,而不是直接赋值Data$Shift <- ...,这样更符合tidyverse的操作逻辑,也能避免意外覆盖数据 regex()里的ignore_case = TRUE一定要加上,能覆盖"First"、"FIRST"、"first"等各种大小写变体- 如果你的班次关键词还有其他变体(比如早班可能写"morning"),直接把它们加到正则表达式里就行,比如
regex("first|1st|morning", ignore_case = TRUE)
内容的提问来源于stack exchange,提问作者britt
相关产品推荐
相关产品推荐

