R dplyr如何从含分隔符的job字符串生成多列指示变量
解法说明
你可以使用tidyverse生态的工具快速实现需求,具体操作如下:
1. 依赖包安装加载
如果还没安装tidyverse先执行安装,已经安装直接加载即可:
# 安装包(仅需运行一次) install.packages("tidyverse") # 加载包 library(tidyverse)
2. 核心处理代码
以下两种方案都可以实现需求,选其中一种即可:
方案1:长表转换法(兼容性更好,适合标签不固定的场景)
# 假设你的原tibble存储在变量df中,按需替换为你实际的变量名 result <- df %>% # 新增临时行号用于行匹配 mutate(row_id = row_number()) %>% # 按分隔符拆分job列为长格式 separate_rows(job, sep = "-") %>% # 统一转小写匹配预期列名,标记存在的标签 mutate( job = tolower(job), flag = TRUE ) %>% # 长表转宽表生成对应列,不存在的标签填充为FALSE pivot_wider( names_from = job, values_from = flag, values_fill = FALSE ) %>% # 删除临时行号和job为NA生成的冗余列 select(-row_id, -`na`)
方案2:批量匹配法(代码更简洁,运行效率更高)
# 先提取所有唯一的job标签 all_tags <- df$job %>% str_split("-") %>% unlist() %>% na.omit() %>% tolower() %>% unique() # 批量生成布尔标识列 result <- df %>% mutate(across(all_of(all_tags), ~str_detect(tolower(job), fixed(.x)), .names = "{.col}"))
3. 自定义输出格式
如果需要输出Y/N而不是布尔值,做如下调整即可:
- 方案1把
flag = TRUE改成flag = "Y",values_fill = FALSE改成values_fill = "N" - 方案2把
~str_detect(tolower(job), fixed(.x))改成ifelse(str_detect(tolower(job), fixed(.x)), "Y", "N")
内容的提问来源于stack exchange,提问作者monkey
相关产品推荐
相关产品推荐

