R语言如何对dataframe的指定多列批量执行多个gsub函数?
你原有代码存在几处错误,修正后即可正常运行:
- gsub用法错误:管道传入的数值需要用
.指代,你代码里的x没有提前定义,无法识别 - 正则规则错误:第一个匹配规则里多个匹配项之间没有加
|做或匹配,相当于匹配一整串连续的特殊字符,基本不会命中;标点符号的预定义类拼写错误,[[:punctx:]]应为[[:punct:]] - 多列处理参数错误:指定处理列的时候只需要传列名字符串,不需要加
jobs$前缀,且旧版colwise语法兼容性差,现在更推荐用across实现多列批量处理 - 缺失NA处理:你的数据框里有大量NA值,函数运行遇到NA会返回异常结果
修复后可直接运行的代码
以目前通用性更强的tidyverse语法为例:
# 加载依赖包 library(dplyr) library(stringr) # 定义文本处理函数 process_job <- function(x) { # 跳过NA值避免报错 ifelse(is.na(x), NA, x %>% # 统一转小写 str_to_lower() %>% # 移除@用户名、链接、数字、话题标签、非ASCII字符、首尾空格 str_remove_all("@\\w+|https?://.+|\\d+|#\\w+|[^\\x01-\\x7F]|^\\s+|\\s+$") %>% # 所有标点替换为空格 str_replace_all("[[:punct:]]", " ") %>% # 多个连续空格/制表符合并为单个空格 str_replace_all("[ |\t]+", " ") %>% # 移除指定职级词汇 str_remove_all("senior|junior|trainee|head") %>% # 最后清理一次首尾空格 str_trim() ) } # 批量应用到4个job列 jobs_processed <- jobs %>% mutate(across(c(job1, job2, job3, job4), process_job))
处理后示例效果:原Senior DWH&BI Engineer会转换为dwh bi engineer,原Trainee ES Computer会转换为es computer,符合文本清洗需求。
如果你不想引入stringr依赖,用base R的gsub也可以实现,处理函数写法如下:
process_job_base <- function(x) { ifelse(is.na(x), NA, { x <- tolower(x) x <- gsub("@\\w+|https?://.+|\\d+|#\\w+|[^\\x01-\\x7F]|^\\s+|\\s+$", "", x) x <- gsub("[[:punct:]]", " ", x) x <- gsub("[ |\t]+", " ", x) x <- gsub("senior|junior|trainee|head", "", x) trimws(x) }) }
内容的提问来源于stack exchange,提问作者Theresa_S
相关产品推荐
相关产品推荐

