一文学会使用
stringr包重要函数的基本使用方法

大家好,我是阿琛。以简单易懂的介绍,带领大家快速入门数据处理,这里是R数据清洗栏目。在上一期的内容中,我们简单认识了一下字符型变量的生存,以及stringr包中部分函数的使用方法(R语言小白入门课| 一刻钟教你学会正则表达式)。在内容的最后,简单的介绍了一些重要函数的名称,不知道大家有去尝试提前认识一下他们吗?知识点虽然基础,但却往往能在分析过程中产生意想不到的重要作用。
在本期的内容中,我们将围绕stringr包的这些重要函数,一一给大家展示一下这些函数的基本使用方法。下面,我们继续来学习一下字符串的相关处理知识。
1.R包的安装与读取
#R包准备 library(tidyverse) library(stringr)
2.匹配检测
当想要确定一个字符型向量是否包含某一个特定模式时,可以使用str_detect()函数。
#str_detect()函数 str1 <- c("abcde", "defxy", "xyzab") str_detect(str1, "xy") #[1] FALSE TRUE TRUE
通过str_detect()函数,结果会对向量中的每个变量进行匹配,随后返回一个与输入向量具有相同长度的逻辑向量值。
2.1 锚点
在默认情况下,正则表达式会匹配字符串中的任意部分。然而,有时候,我们需要一些特定符号的帮助,即所谓的锚点,以使得R能从字符串的开头或者结尾处进行匹配。
(1). ^从字符串开头进行匹配;
(2). $从字符串结尾进行匹配;
str_detect(str1, "^ab") #匹配以ab开头的字符变量 #[1] TRUE FALSE FALSE str_detect(str1, "ab$") #匹配以ab开头的字符变量 #[1] FALSE FALSE TRUE
甚至,我们可以同时使用^和$两个符号,来对一个完整的字符串进行精准的匹配。
str_detect(str1, "^abcde$") #精准匹配名为abcde的字符变量 #[1] TRUE FALSE FALSE
2.2 字符类符号
此外,还有几种常见的字符类符号:
(1). .可以匹配除换行符以外的任意字符;
(2). \d可以匹配任意数字;
(3). \s可以匹配任意空白字符(如空格,制表符和换行符);
(4). [abc]可以匹配a,b或c
(5). [^abc]可以匹配除a,b和c外的任意字符
str_detect(str1, "[az]") #匹配包含a或b的字符变量 #[1] TRUE FALSE TRUE
当然,各种符号之间也是可以相互交叉使用的。下面,我们一起来看一个示例,找出str1向量中不包含a或z的所有变量。
#找出str1向量中不包含a或z的所有变量 x1 <- !str_detect(str1, "[az]") x2 <- str_detect(str1, "^[^az]+$") identical(x1, x2) #[1] TRUE
在此,x1和x2使用了正反两种不同的思路来进行结题。在x1中,首先通过[]找出包含a或z的所有变量,随后通过!来进行取反;而在x2中,则是使用了[^]来匹配除a和z之外的任意字符,通过+表示1次或者多次重复,结合^和$联用,最终得到结果。
2.3 重复
正则表达式的一大强大功能便是可以通过简单的字符来表达多次匹配的含义,从而大大简化代码内容:
(1). ?表示0次或1次;

(2). +表示1次或多次;
(3). *表示0次或多次;
(4). {n}表示匹配n次;
(5). {n,}表示匹配n次及其以上次;
(6). {,m}表示最多匹配m次;
(7). {n, m}表示匹配n到m次;
3.提取匹配内容
要想提取匹配的实际文本内容,我们可以进一步使用str_extract()和str_extract_all()函数。首先,我们先来看一下示例,再来讲讲这两个函数之间的差异。
(1). str_extract()函数的使用
shopping_list <- c("apples x4", "bag of flour", "bag of sugar", "milk x2 x3") str_extract(shopping_list, "\\d") #匹配任意数字 #[1] "4" NA NA "2"
(2). str_extract_all()函数的使用
str_extract_all(shopping_list, "\\d", simplify = FALSE) #匹配所有的任意数字
可以看到,对比两个函数的输出结果,str_extract()函数仅输出匹配到的第一个文本内容;而str_extract_all()函数则会输出所有能够匹配到的文本内容,而且当参数simplify设置为默认的FALSE时,则输出为列表形式,当修改为TRUE时则输出一个由字符串所组成的矩阵。
str_extract_all(shopping_list, "\\d", simplify = TRUE) #修改参数内容
4.替换匹配内容
#4.1 str_replace()函数 str_replace(str1, "[aexy]", "-") #[1] "-bcde" "d-fxy" "-yzab" #4.2 str_replace_all()函数 str_replace_all(str1, "[aexy]", "-") #[1] "-bcd-" "d-f--" "--z-b"
首先,str_replace()函数和str_replace_all()函数均可以使用新字符串替换被匹配到的内容。然而,两个函数之间函数存在一定的差异的:与上一对函数一致,str_replace()函数仅匹配第一个内容,而str_replace_all函数则匹配并替换所有内容。
5.字符串拆分
使用str_split()函数可以将字符串拆分成多个片段。
fruits <- c( "apples and oranges and pears and bananas", "pineapples and mangos and guavas" str_split(fruits, " and ")
在此,以“ and ”为拆分标志,将变量进行拆分,并以列表的形式进行展示。
str_split(fruits, " and ", simplify = TRUE)
增添simplify = TRUE的设置,最终将结果以矩阵的形式进行输出。
而参数n的设置,可以表示将一个变量按“ and ”为标志,拆分成为n个内容。
str_split(fruits, " and ", n = 2)
6.定位匹配内容
此外,str_locate()和str_locate_all()函数可以给出每个匹配的开始位置和结束位置。
fruit <- c("apple", "banana", "pear", "pineapple") str_locate(fruit, "a.") #输出内容“a+任意字符”的起始和终止位置
在使用过程中,我们甚至可以先通过str_locate()函数找出匹配的模型,然后使用str_sub()函数来提取或修改匹配的内容。
叫我分割线
,到此为止,基础部分stringr包以及常用的正则表达式内容已经大部分讲解完了,大家在结束后根据讲解的内容多多联系。当stringr的相关函数结合dplyr包或其他函数时,将发挥出巨大的作用,相信能够对后续的数据清洗以及分析处理产生帮助~在后面的内容中,我们也将进一步讲解多者联合使用来解决实际分析问题。
回复“阿琛32”可以获得本次的示例代码和数据~~~
R数据清洗系列传送门
十分钟轻松学会R数据清洗技巧,生信小白必须跨越的第一关
R语言小白入门课|一刻钟带你学会R数据转化
欢迎大家关注解螺旋生信频道-挑圈联靠公号~

继续阅读
阅读原文