首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >R中向量的子串提取

R中向量的子串提取
EN

Stack Overflow用户
提问于 2015-03-22 16:24:39
回答 3查看 2.9K关注 0票数 3

我正在尝试从非结构化文本中提取子字符串。例如,假设一个国家名称向量:

代码语言:javascript
运行
复制
countries <- c("United States", "Israel", "Canada")

如何传递这个字符值向量,从非结构化文本中提取准确的匹配。

代码语言:javascript
运行
复制
text.df <- data.frame(ID = c(1:5), 
text = c("United States is a match", "Not a match", "Not a match",
         "Israel is a match", "Canada is a match"))

在本例中,所需的输出是:

代码语言:javascript
运行
复制
ID     text
1      United States
4      Israel
5      Canada

到目前为止,我一直在使用gsub,在这里删除所有非匹配项,然后删除带有空值的行。我也一直在使用stringr包中的str_extract,但是没有成功地使正则表达式的提示正确。如能提供任何帮助,将不胜感激!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-03-22 16:29:35

1.弦R

我们可以首先在“grep”中使用“indx”(通过折叠“国家”向量形成)作为模式,然后使用“str_extract”从“文本”列获取模式元素,将其分配给子集数据集(“text.df1”)的“文本”列。

代码语言:javascript
运行
复制
library(stringr)
indx <- paste(countries, collapse="|")
text.df1 <- text.df[grep(indx, text.df$text),]
text.df1$text <- str_extract(text.df1$text, indx)
text.df1
#  ID          text
#1  1 United States
#4  4        Israel
#5  5        Canada

2.碱基R

无需使用任何外部包,我们就可以删除“ind”中的字符以外的字符。

代码语言:javascript
运行
复制
text.df1$text <- unlist(regmatches(text.df1$text, 
                           gregexpr(indx, text.df1$text)))

3.弦I

我们也可以使用来自stringi的更快的stringi

代码语言:javascript
运行
复制
library(stringi)
na.omit(within(text.df, text1<- stri_extract(text, regex=indx)))[-2]
#  ID         text1
#1  1 United States
#4  4        Israel
#5  5        Canada
票数 3
EN

Stack Overflow用户

发布于 2015-03-22 16:32:40

下面是一种使用data.table的方法

代码语言:javascript
运行
复制
library(data.table)
##
R>  data.table(text.df)[
    sapply(countries, function(x) grep(x,text),USE.NAMES=F),
    list(ID, text = countries)]
   ID          text
1:  1 United States
2:  4        Israel
3:  5        Canada
票数 3
EN

Stack Overflow用户

发布于 2015-03-22 17:11:51

创建模式p,并使用strapply提取每个不匹配组件的text返回NA的每个组件的匹配。最后,使用na.omit删除NA值。这是非破坏性的(即text.df没有被修改):

代码语言:javascript
运行
复制
library(gsubfn)

p <- paste(countries, collapse = "|")
na.omit(transform(text.df, text = strapply(paste(text), p, empty = NA, simplify = TRUE)))

给予:

代码语言:javascript
运行
复制
  ID          text
1  1 United States
4  4        Israel
5  5        Canada

使用dplyr还可以如下所示(使用上面的p ):

代码语言:javascript
运行
复制
library(dplyr)
library(gsubfn)

text.df %>% 
  mutate(text = strapply(paste(text), p, empty = NA, simplify = TRUE)) %>%
  na.omit
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29196831

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档