用stringr操作字符串

一、基础

stringr不属于tidyverse包中的一员,需要手动加载。

二、字符串基础

创建字符串

用单引号或双引号标志出来的就是字符串,建议多用双引号。如果想用双引号,可以把双引号放在单引号里面。

str1<-"This is a tring"
str2<-'可以把"引用的内容"放在单引号里面'

对于特殊符号用转义字符\

比如想输出\,你得写“\”。
想输出",你得写“"”。

定义字符串向量

strVec<- c("a","b","cde")

字符串长度

用str_length函数

str_length(strVec)

结果会输出一个向量,代表每个元素的字符长度。

连接字符串

str_c("x","y")

结果"xy"。
也可以连接一个向量,比如:

str_c(strVec,collapse=",")

要记住,str_c是向量化操作
所以如果你进行下面的操作,你可以想一下结果:

str_c("|-",strVec,"-|")

结果是:
“|-a-|” “|-b-|” “|-cde-|”

截取字符串

str_sub可以进行截取

strVec2 <- c("12345","abcde","54321")
str_sub(strVec2,1,3)

结果如下:
“123” “abc” “543”

当然也可以倒着取值:

str_sub(strVec2,-3,-1)

结果:“345” “cde” “321”

用正则表达式匹配字符串

正则表达式用简短的方式描述字符串模式。
str_view和str_view_all两个函数接受两个值:第一个是一个字符串向量,第二个是正则表达式。

不熟悉正则表达式的可以搜搜其它教程,在这里不是我们的重点,所以不赘述。我们由简入繁地来演示一下操作:

  1. 最简单的匹配,尚无正则表达式:
str_view(strVec2,"3")

结果:
[1] │ 12<3>45
[3] │ 54<3>21

  1. 使用“.”这个通配符
str_view(strVec2,".3.")

结果:
[1] │ 1<234>5
[3] │ 5<432>1
".“匹配除“\n”和”\r"之外的任何单个字符。所以,就是把字符3前后各一个字符给包进来了。

三、字符串实用进阶

在实际应用中,我们常常需要:

  1. 决定哪些字符串符合一个正则表达式
  2. 找到这些字符串的位置
  3. 提取这些字符串的内容
  4. 替换这些字符串的内容
  5. 根据匹配的内容分割字符串
    结合这些需求,我们可能会用到以下函数

str_detect()

它会返回一个与原来字符串向量相同长度的逻辑向量,每个值代表字符串是否匹配。

str_detect(strVec2,"3")

结果:TRUE FALSE TRUE

计算多少符合

我们知道逻辑值TRUE和FALSE在被当成整数值来计算的时候,会变成1和0。如果我们想知道有多少值匹配表达式。则可以像下面这样:

sum(str_detect(strVec2,"3"))

结果:2

取向量的子集

我们也可以通过str_detect来选择字符串向量的子集。

strVec2[str_detect(strVec2,"3")]

结果:“12345” “54321”
当然,如果我们筛选的是一个数据集,可以用filter的形式。

str_count()

计算每个字符串中符合正则表达式的字符串的数量。

str_extract()

为了演示这个函数,我们使用"Havard sentences",这个自带在stringr包里。
在这里插入图片描述
如果我们想找出所有带有常见颜色的句子,我们怎么办呢?
第一步:创建一个包含常见颜色的向量,然后把它转换为正则表达式。

colors <- c("red","orange","yellow","green","cyan","blue","purple")
 color_match <- str_c(colors,collapse="|")
color_match

结果:
“red|orange|yellow|green|cyan|blue|purple”
第二步:用str_subset取出匹配的值

has_color<-str_subset(sentences,color_match)

在这里插入图片描述

第三步:把颜色值提取出来

matches <- str_extract(has_color,color_match)
matches

结果如下:
[1] “blue” “blue” “red” “red” “red” “blue” “yellow” “red” “red” “green”
[11] “red” “red” “blue” “red” “red” “red” “red” “blue” “red” “blue”
[21] “red” “green” “red” “red” “red” “red” “red” “red” “green” “red”
[31] “green” “red” “purple” “green” “red” “red” “red” “red” “red” “blue”
[41] “red” “blue” “red” “red” “red” “red” “green” “green” “green” “red”
[51] “red” “yellow” “red” “orange” “red” “red” “red”

但是要记住,str_extract只提取第一个值。
如果一个句子中用多个匹配,那后面的值会被忽略。这个时候可以用str_extract_all函数。

str_replace

这个让你可以替换匹配的字符串。

str_replace(strVec2,"3","0")

结果:
“12045” “abcde” “54021”

你也可以用str_replace_all进行多个匹配替换

 str_replace_all(strVec2,c("1"="one","0"="3"))

结果:
“one2345” “abcde” “5432one”

str_split

str_split可以把一个字符串分成好几块。

sentences %>% head(5) %>% str_split(" ")
``
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/9dcf7c3cf08645a8aa7eaf133bf4b4a9.png)

## str_locate
str_locate可以给出匹配的起点和结束点,有了这些,我们可以在用str_sub进行提取和修改。

```r
str_locate(strVec2,"3")

在这里插入图片描述

四、stringi

我们上面说的都是stringr包里面的函数,stringi是从stringi包里提取和简化出来的。所以如果你觉得stringr包里的函数不够用,去stringi包里找一找。

  • 8
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值