You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:19:34