在R语言中使用正则表达式或子串提取列中的特定词汇
嘿,针对你在R语言中从数据列提取特定词汇的需求,我整理了几个实用的方法,结合你给出的样本数据来演示:
首先先构造你的样本数据框方便测试:
df <- data.frame( Opex_Spend_Month = c(92179.84, 297.82, 13974.8, 138.6, NA, NA, 1388.65), Opex_Spend_YTD = c(113542.84, 82392.82, 34917.8, 63125.6, 73097, 96035, 68934.65), Major_Category = rep("Contingent Labour", 7), NBS_Region = rep("EUROPE", 7), Sub_Category = c("TEMP:OTH.CONT.WORKER", "TEMP:OTH.CONT.WORKER", "TEMP:OTH.CONT.WORKER", "TEMP:OTH.CONT.WORKER", "TEMP:MSP NON IT", "TEMP:MSP NON IT", "TEMP:MSP NON IT") )
方法1:Base R 正则表达式(最通用)
如果你的Sub_Category列都是以TEMP:开头,想要提取冒号后面的全部内容,用sub()函数最方便,它可以直接替换掉开头的TEMP:部分:
# 提取冒号后的所有内容 df$Extracted_Term <- sub("^TEMP:", "", df$Sub_Category)
解释:^TEMP:是正则表达式,^表示匹配字符串开头,把匹配到的部分替换为空字符串,就得到了我们需要的内容。
运行后查看结果:
print(df$Extracted_Term)
输出:
[1] "OTH.CONT.WORKER" "OTH.CONT.WORKER" "OTH.CONT.WORKER" "OTH.CONT.WORKER" [5] "MSP NON IT" "MSP NON IT" "MSP NON IT"
方法2:Base R 子串截取(适合固定格式)
如果TEMP:的长度固定(永远是5个字符:T-E-M-P-:),可以直接用substr()截取从第6位开始到末尾的内容:
df$Extracted_Term <- substr(df$Sub_Category, start = 6, stop = nchar(df$Sub_Category))
这个方法比正则更快,但缺点是如果Sub_Category的前缀有变化(比如不是TEMP:)就失效了,所以只适合格式完全固定的场景。
方法3:Tidyverse stringr 包(更直观的语法)
如果你习惯用tidyverse的管道语法,可以用stringr包的str_extract()函数,配合正则正向断言来提取内容:
library(stringr) library(dplyr) df <- df %>% mutate(Extracted_Term = str_extract(Sub_Category, "(?<=TEMP:).*"))
解释:(?<=TEMP:)是正则正向断言,表示匹配TEMP:后面的所有内容(.*代表任意字符任意长度),语法上更清晰,适合复杂的字符串提取需求。
进阶:提取更细分的词汇
如果你的需求不是提取全部内容,而是比如提取OTH、MSP这类前缀,可以调整正则表达式:
# 提取冒号后第一个分隔符(点或空格)前的内容 df$Short_Term <- sub("^TEMP:([A-Z]+)[. ].*", "\\1", df$Sub_Category)
运行后df$Short_Term会得到:["OTH", "OTH", "OTH", "OTH", "MSP", "MSP", "MSP"]
内容的提问来源于stack exchange,提问作者Shuvayan Das
相关产品推荐
相关产品推荐

