如何在R语言中使用正则表达式编辑数据框的行业名称列?
解决R中提取行业大类的正则表达式问题
我来帮你搞定这个提取行业名称大类的需求!你需要保留每个字符串中第一个分隔符(-)左侧的内容,舍弃右侧所有部分,之前尝试的方法没找对正则匹配的逻辑,下面给你可行的解决方案:
为什么之前的方法不生效?
stri_trim_right(..., pattern = "[-]"):这个函数是从字符串右侧修剪匹配的字符,只会去掉末尾的减号,不会处理中间的内容,所以第二个字符串会剩下"FINANCIAL SERVICES - Closed End Fund -",不符合预期。stri_trim_right(..., pattern = "[A-Z]"):这是从右侧修剪大写字母,完全偏离了需求,只会去掉最后一个大写字母,结果自然不对。gsub("[^A-Z]","", ...):这个是去掉所有非大写字母的字符,丢失了空格、&这些必要内容,显然不是你要的结果。
正确的解决方案
方法1:基础R的gsub函数
用正则表达式匹配第一个-(空格+减号+空格)及其之后的所有内容,替换为空字符串:
# 构造示例数据 Industries <- c("LEISURE - Restaurants", "FINANCIAL SERVICES - Closed End Fund - Equity", "AEROSPACE/DEFENSE - Aerospace/Defense Products & Services", "METALS & MINING - Industrial Metals & Minerals") Industries <- data.frame(Industries) # 提取大类 Industries$Industry_Category <- gsub(" - .*", "", Industries$Industries) # 查看结果 Industries$Industry_Category
输出结果:
[1] "LEISURE" "FINANCIAL SERVICES" "AEROSPACE/DEFENSE" "METALS & MINING"
方法2:stringr包的str_remove(更简洁)
如果你习惯用tidyverse系列的包,stringr::str_remove语法更直观:
library(stringr) Industries$Industry_Category <- str_remove(Industries$Industries, " - .*")
效果和上面的gsub完全一致。
鲁棒性优化(应对分隔符空格不一致的情况)
如果你的数据中分隔符可能存在空格不规范的情况(比如-前后没有空格,或者只有单侧有空格),可以调整正则表达式,匹配任意数量的空格:
# 兼容各种空格情况的正则 Industries$Industry_Category <- gsub("\\s*-\\s*.*", "", Industries$Industries)
这个正则会匹配-前后零个或多个空格,然后去掉之后的所有内容,适用范围更广。
内容的提问来源于stack exchange,提问作者Kirsten
相关产品推荐
相关产品推荐

