在R语言中提取至首次出现“national emergency number”的文本数据
在R语言中提取至首次出现特定文本前的内容
嘿,我来帮你搞定这个提取文本的需求!你需要抓取每行里首次出现“national emergency number”之前的所有内容,这里有两种靠谱的实现方法,适配不同的R使用习惯:
方法一:使用tidyverse的stringr包(推荐,语法更直观)
首先我们先构造你提供的示例数据:
# 创建示例数据框 df <- data.frame( ColumnA = c( "911 is the national emergency number in Canada.Kids Help Phone is a nationwide 24-hour, toll-free, confidential crisis line and counselling service available to Canadians under the age of twenty.", "112 and 199 are the national emergency numbers in Cyprus.Cyprus Samaritans is available every day from 4pm to 12am and is confidential. They can be reached at 8000 7773." ), stringsAsFactors = FALSE )
然后用str_extract配合正则表达式的正向预查来提取目标内容:
library(stringr) # 提取首次出现关键词前的内容 df$extracted_content <- str_extract(df$ColumnA, "^.*?(?=national emergency number)") # 查看结果 print(df$extracted_content)
运行后你会得到预期的结果:
[1] "911 is the " "112 and 199 are the "
这里的正则^.*?(?=national emergency number)是核心:
^匹配文本开头.*?是非贪婪模式的任意字符匹配,确保只取到首次出现关键词前的内容(?=...)是正向预查,只匹配关键词前面的位置,不会把关键词本身包含进去
方法二:使用Base R(无需额外安装包)
如果你不想加载额外的包,用Base R的sub函数就能搞定,原理是把首次出现的关键词及其后面的所有内容替换为空:
# Base R方案 df$extracted_content_base <- sub("national emergency number.*", "", df$ColumnA) # 查看结果 print(df$extracted_content_base)
这个方法同样能得到和上面完全一致的结果,sub默认只处理首次匹配的内容,正好符合你的需求。
额外处理:应对无关键词的行
如果你的数据里存在没有“national emergency number”的行,上面的方法会返回NA(stringr)或原字符串(Base R)。如果需要统一处理这种情况,可以加个判断:
# stringr版处理无关键词的行 df$extracted_content <- ifelse(str_detect(df$ColumnA, "national emergency number"), str_extract(df$ColumnA, "^.*?(?=national emergency number)"), NA) # 这里可以替换成你需要的默认值,比如原字符串 # Base R版处理无关键词的行 df$extracted_content_base <- ifelse(grepl("national emergency number", df$ColumnA), sub("national emergency number.*", "", df$ColumnA), NA)
内容的提问来源于stack exchange,提问作者Sukriti Singh
相关产品推荐
相关产品推荐

