一、基础
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两个函数接受两个值:第一个是一个字符串向量,第二个是正则表达式。
不熟悉正则表达式的可以搜搜其它教程,在这里不是我们的重点,所以不赘述。我们由简入繁地来演示一下操作:
- 最简单的匹配,尚无正则表达式:
str_view(strVec2,"3")
结果:
[1] │ 12<3>45
[3] │ 54<3>21
- 使用“.”这个通配符
str_view(strVec2,".3.")
结果:
[1] │ 1<234>5
[3] │ 5<432>1
".“匹配除“\n”和”\r"之外的任何单个字符。所以,就是把字符3前后各一个字符给包进来了。
三、字符串实用进阶
在实际应用中,我们常常需要:
- 决定哪些字符串符合一个正则表达式
- 找到这些字符串的位置
- 提取这些字符串的内容
- 替换这些字符串的内容
- 根据匹配的内容分割字符串
结合这些需求,我们可能会用到以下函数
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包里找一找。