欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

R语言学习笔记(2)——str_detect()函数

程序员文章站 2022-05-15 14:14:38
...

摘要

这次的问题是要弄清除一个单词在一片文章里出现的次数,用到了str_detect()函数。我把遇到的问题及解决方法分享一下,函数说明按照自己容易理解的方式表达,欢迎指正,谢谢。

函数说明

  • str_detect():确定一个字符向量能否匹配一种模式
  • str_detect(string,pattern,negate=FALSE)
  • string:待匹配字符串(我这里是文章)
  • pattern:待匹配的模式(需要去查找的字符串)
  • negate:默认为FALSE,如果为TRUE,则返回没有匹配到的元素
  • 返回值是逻辑值

实例

1.先导入一个txt文件,各位用自己的文件吧,导入文件需要用到readr包,使用str_detect()函数需要用tidyverse包。

library(readr)
library(tidyverse)
#  ***处为各位的文件路径
#   what='c' 是以字符形式读入文件
textA=scan('C:/******/text A.txt',what = 'c') 

文件读入后大概就是下面这个样子(textA的部分内容):
R语言学习笔记(2)——str_detect()函数
2.然后要找but,may,maybe,might,would,will出现的次数

a<-sum(str_detect(textA,'but'))
b<-sum(str_detect(textA,'may'))
c<-sum(str_detect(textA,'maybe'))
d<-sum(str_detect(textA,'might'))
e<-sum(str_detect(textA,'would'))
f<-sum(str_detect(textA,'will'))

这样做比较麻烦,后来就想着把这些词放进一个向量里,用循环来求总次数

words<-c('but','might','may','maybe','would','will')
sum_words=0
for (i in 1:length(words)){
  sum_words=sum_words+sum(str_detect(textA,words[i]))
}
sum_words

然后问题出现了,这里找到的次数和我在word里查找的次数不相同,起初我以为是不能把字符串放到向量里然后用str_detect()这个函数,后来发现错误是因为查找机制不同。
(1)word里默认是不区分大小写
R语言学习笔记(2)——str_detect()函数
(2)而str_detect()是区分大小写的

str_detect(c('But','but','BUT'),'but')
sum(str_detect(c('But','but','BUT'),'but'))

运行结果如下:
R语言学习笔记(2)——str_detect()函数
所以,理论上在R里我们要把but的常用形态都列出来,添加到向量words里,即

words<-c('but','But','might','may','maybe','would','will')
sum_words=0
for (i in 1:length(words)){
  sum_words=sum_words+sum(str_detect(textA,words[i]))
}
sum_words

至于如何把既容易出现在开头,又容易出现在文中的单词的几种形态更方便的表现出来我还没有想好,以后再研究。

3.其他的坑
还有个地方没有注意到,因为这个文件里没有may和maybe出现 ,所以把but的问题解决掉就不会结果出错。但是在后来的测试中发现,默认情况下,str_detect()并没有精确匹配,直接看代码吧。

sum(str_detect(c('push','business', 'us'),'us'))

R语言学习笔记(2)——str_detect()函数
运行结果居然是三次,只要是包含了us的,它都会给你返回来,所以这里需要稍微改动一下——用正则表达式来表示us。
正则表达式中的锚点:

  • ^ 从字符串开头进行匹配
  • $从字符串末尾进行匹配

所以可以把us写成 ^us$

sum(str_detect(c('push','business', 'us'),'^us$'))

R语言学习笔记(2)——str_detect()函数
这样就可以精确匹配到us了。