Chapter 59 Intro to stringr 包入门详解

Yichi Zhang and Mingfang Chang

In this file, we will make an introduction of functions in stringr package with detailed examples in Chinese.

59.2 字符串匹配函数(Detect Matches)

59.2.1 str_detect(string, pattern)

检测字符串中是否包含匹配字符,返回TRUE或FALSE。
示例:

## [1] TRUE TRUE TRUE TRUE
## [1] FALSE  TRUE FALSE FALSE
## [1] TRUE

59.2.2 str_which(string, pattern)

查找字符串中匹配字符的索引,返回索引。
示例:

## [1] 1 2 3 4
## [1] 1 3 4
## [1] 1

59.2.3 str_count(string, pattern)

计数字符串匹配次数,返回计数。
示例:

## [1] 1 3 1 1
## [1] 2 0 1 3
## [1] 1

59.2.4 str_locate(string, pattern)

找到字符串中第一个匹配字符的位置,返回位置,如无匹配则返回NA。
示例:

##      start end
## [1,]     1   1
## [2,]     2   2
## [3,]     3   3
## [4,]     5   5
##      start end
## [1,]     2   2
## [2,]    NA  NA
## [3,]     1   1
## [4,]     1   1
##      start end
## [1,]     2   2

59.2.5 str_locate_all(string, pattern)

找到字符串中所有匹配字符的位置,返回位置。
示例:

## [[1]]
##      start end
## [1,]     2   2
## [2,]     3   3
## 
## [[2]]
##      start end
## 
## [[3]]
##      start end
## [1,]     1   1
## 
## [[4]]
##      start end
## [1,]     1   1
## [2,]     6   6
## [3,]     7   7
## [[1]]
##      start end
## [1,]     1   1
## [2,]     7   7

59.3 字符串的截取函数(Subset Strings)

59.3.1 str_sub(string, start index, end index)

用于直接通过索引来分割字符串,并返回起始索引到结束索引中的全部字符。
示例:

## [1] "Hel"
## [1] "o Worl"

函数的输入也可以是一串字符串。

## [1] "ppl" "ana" "tra"

59.3.2 str_subset(string,pattern)

输入一个字符串或者一系列字符串,并给定一种模式,返还拥有这种模式的字符串。
示例:

## [1] "Hello World"
## [1] "Banana"
## character(0)

59.3.3 str_extract(string,pattern)

输入一个字符串或者一串字符串,给定一种模式,返回在每个字符串中第一个符合模式的子字符串,如果某个字符串中并没有我们输入的模式,则返回空值NA,这个函数的输出类型是一个包含多个字符串的向量。
示例:

## [1] "ui" NA   NA   NA

对于这个函数使用正则表达式来表达字符串的模式会更有意义,我们将会在最后具体讨论正则表达式的写法。

## [1] NA          "Score:89"  "Score:170" NA

我们也可以使用函数str_extract_all(string, pattern) 返回每个字符串当中所有符合的模式的子字符串(并不只是第一个)。
示例:

## [[1]]
## character(0)
## 
## [[2]]
## [1] "Score:89"     "Ratescore:77"
## 
## [[3]]
## [1] "Score:170"
## 
## [[4]]
## character(0)

59.3.4 str_match(string, pattern)

输入一个字符串或者一串字符串,给定一种模式,返回在每个字符串中第一个符合模式的子字符串,如果某个字符串中并没有我们输入的模式,则返回空值NA,但是不同于str_extract()函数, 此函数返回一个包含多个字符串的矩阵。
示例:

##      [,1]        [,2]     [,3] 
## [1,] NA          NA       NA   
## [2,] "Score:89"  "Score:" "89" 
## [3,] "Score:170" "Score:" "170"
## [4,] NA          NA       NA

我们也可以用str_match_all()函数去返回所有符合模式的子字符串,在返回的矩阵中,第一列代表一个符合模式的完整的子字符串,后面的每一列代表了完整的子字符串中的每一个组,这个组是在正则表达式中用括号分割开来的(例如“([A-Z][a-z][:])(\d)” 中, 第一个组就是([A-Z][a-z][:]), 第二个组则是(\d))。

## [[1]]
##      [,1] [,2] [,3]
## 
## [[2]]
##      [,1]           [,2]         [,3]
## [1,] "Score:89"     "Score:"     "89"
## [2,] "Ratescore:77" "Ratescore:" "77"
## 
## [[3]]
##      [,1]        [,2]     [,3] 
## [1,] "Score:170" "Score:" "170"
## 
## [[4]]
##      [,1] [,2] [,3]

59.4 字符串长度编辑函数(Manage Lengths)

59.4.1 str_length(string)

返回字符串长度,即所含字符个数。
示例:

## [1] 5 6 4 9
## [1] 7
## [1] 1
## [1] 0

59.4.2 str_pad((string, width, side = c(“left”, “right”,“both”), pad = " ")

用所给字符填充字符串至所给长度,可总左边或右边或两边填充,返回填充后字符串。默认值为从左边以空格填充至所给长度。如果所给长度比字符串长度短,则返回原字符串。
示例:

## [1] "            apple" "           banana" "             pear"
## [4] "        pineapple"
## [1] "******apple******" "*****banana******" "******pear*******"
## [4] "****pineapple****"
## [1] "            apple" "           banana" "             pear"
## [4] "        pineapple"
## [1] "apple------------" "banana-----------" "pear-------------"
## [4] "pineapple--------"
## [1] "  example  "
## [1] "another"

59.4.3 str_trunc(string, width, side = c(“right”, “left”,“center”), ellipsis = “…”)

从所给方向截取字符串并替换为所给字符至所给长度,可以从左边或右边或中间截取,默认为从左边截取,默认替换字符为“…”,返回编辑后字符串。
示例:

## [1] "-le" "-na" "-ar" "-le"
## [1] "ap*e" "ba*a" "pear" "pi*e"
## [1] "apple" "bana%" "pear"  "pine%"
## [1] "ex..."

59.4.4 str_trim(string, side = c(“both”, “left”, “right”))

去掉字符串开头或/和结尾的空格,可以去掉左边或右边或两边的空格,默认为去掉两边空格,返回去掉空格后的字符串。
示例:

## [1] "apple"     "banana"    "pear"      "pineapple"
## [1] "example1"
## [1] "example2 "
## [1] " example3"
## [1] "example4"

59.5 字符串变换与编辑函数(Mutate Strings)

59.5.1 str_sub(string,start index,end index)

可用于返回所有输入的字符串中,从起始索引到结束索引的子字符串。
示例:

## [1] "App" "Ban" "Str"

也可用于替换1所有输入的字符串中,从起始索引到结束索引的子字符串,用于替换的字符串取决的使用者自己定义并指向这个函数的字符串。
示例:

## [1] "hellole"      "helloana"     "helloawberry"

59.5.2 str_replace(string,pattern,replacement)

找个输入法的字符串中第一个符合我们定义的模式的子字符串并用我们输入的替换字符串替换。
示例:

## [1] "Visulization data annlysis"
## [1] "fruit"                         "Test Replacement Ratescore:77"
## [3] "Test Replacement"              "tiger"

59.5.3 str_replace_all(string,pattern,replacement)

找个输入法的字符串中所有符合我们定义的模式的子字符串并用我们输入替换字符串替换,如果这个字符串中不存在我们定义的模式,直接返还原本的字符串。
示例:

## [1] "exploratary Visulization annlysis and Visulization Visulization"
## [1] "fruit"                        "Test Replacement Replacement"
## [3] "Test Replacement"             "tiger"

59.5.4 str_to_lower(string)

将一个字符串或者一个字符串的向量全部变为小写格式。
示例:

## [1] "fff"                    "task"                   "community contribution"

由于不同的国家有不同的大小写规则,我们可以用参数locale去规定在这个小写转变格式中所使用的规则(每个国家的规则有国家的英文缩写表示,具体课查看维基百科https://zh.wikipedia.org/wiki/ISO_639-1%E4%BB%A3%E7%A0%81%E8%A1%A8 语言ISO639表格)。

## [1] "fff"                    "task"                   "community contribution"

59.5.5 str_to_upper(string)

将一个字符串或者一个字符串的向量全部变为大写格式。
示例:

## [1] "FFF"                    "TASK"                   "COMMUNITY CONTRIBUTION"
## [1] "FFF"                    "TASK"                   "COMMUNITY CONTRIBUTION"

59.5.6 str_to_title(string)

将一个字符串或者一个字符串组成的向量变换称标题格式(每个单词的首字母大写)。
示例:

## [1] "Fff"                    "Task"                   "Community Contribution"
## [1] "Fff"                    "Task"                   "Community Contribution"

59.6 字符串分割与拼接函数(Join and Split)

59.6.1 str_c(…, sep = "", collapse = NULL)

将多个字符串拼接成单个字符串,字符串间可添加分割字符,默认分割字符为空字符,返回拼接后字符串。
示例:

## [1] "thisisanexample1"
## [1] "this is an example2"
## [1] "thisisanexample3"

59.6.2 str_c(…, sep = "“, collapse =”")

将一个字符串向量拼接为单个字符串,字符串间可添加分割字符,默认分割字符为空字符,返回拼接后字符串。
示例:

## [1] "thisisanexample1"
## [1] "this*is*an*example2"

59.6.3 str_dup(string, times)

多次复制字符串,返回复制后字符串。
示例:

## [1] "appleappleapple"             "bananabananabanana"         
## [3] "pearpearpear"                "pineapplepineapplepineapple"
## [1] "exampleexampleexampleexampleexampleexampleexample"

59.6.4 str_split_fixed((string, pattern, n)

以所给字符将字符串分割成所给数量的字符串,返回分割后的结果。
示例:

##      [,1]    [,2]  
## [1,] "app"   "le"  
## [2,] "bana"  "na"  
## [3,] "p"     "ear" 
## [4,] "pinea" "pple"
##      [,1]   [,2] [,3]         
## [1,] "this" "is" "an example2"

59.6.5 str_glue(…, .sep = "", .envir = parent.frame())

在字符串内替换变量,变量可在函数内定义,可以连接多个字符串并以所给分隔字符分隔,返回替换后字符串。
示例:

## This is apple, and this is not banana.
## This is pineapple

59.6.6 str_glue_data(.x, …, .sep = "“, .envir = parent.frame(), .na =”NA")

在字符串内替换变量,变量可在函数内以环境、列表、数据框等形式定义,可以连接多个字符串并以所给分隔字符分隔,返回替换后字符串。
示例:

## This is apple,this is not banana

59.7 字符串排序(Order Strings)

59.7.2 str_order(string)

此函数与str_sort()的排序方法和使用方法基本一致,两个函数的主要区别在于str_order()返回的是索引的顺序而不是一个排序过后的新字符串向量。
示例:

## [1] "Community CONTRIBUTION" "FFF"                    "Task"
## [1] 3 1 2
## [1] "Task"                   "FFF"                    "Community CONTRIBUTION"
## [1] 2 1 3
## [1] "Community CONTRIBUTION" "FFF"                    "Task"                  
## [4] NA
## [1] 3 1 2 4

59.8 字符串的编译格式与显示格式修改函数(Encode and Visualize Strings)

59.8.1 str_conv(string, encoding)

更改当前字符串的编码格式。
示例:

##  [1] e6 ad a6 e6 b1 89 e6 ac a2 e8 bf 8e e4 bd a0
## [1] "武汉欢迎你"

59.8.2 str_view(string, pattern)

通过html的形式显示我们输入的模式在字符串中第一个出现的位置的位置。
示例:

我们同时也可以使用函数str_view_all(string, pattern)去显示我们输入的字符串中所有和我们所选择的模式匹配的子字符串的位置。
示例:

59.8.3 str_wrap(string,width,indent,exdent)

改变字符串的显示格式。
示例:

## Data analysis is a process of inspecting,
## cleansing, transforming and modeling data with the
## goal of discovering useful information, informing
## conclusion and supporting decision-making. Data
## analysis has multiple facets and approaches,
## encompassing diverse techniques under a variety of
## names, and is used in different business, science,
## and social science domains. In today's business
## world, data analysis plays a role in making
## decisions more scientific and helping businesses
## operate more effectively.
##           Data analysis is a process of inspecting,
## cleansing, transforming and modeling data with the
## goal of discovering useful information, informing
## conclusion and supporting decision-making. Data
## analysis has multiple facets and approaches,
## encompassing diverse techniques under a variety of
## names, and is used in different business, science,
## and social science domains. In today's business
## world, data analysis plays a role in making
## decisions more scientific and helping businesses
## operate more effectively.
## Data analysis is a process of inspecting,
##                cleansing, transforming and modeling data with the
##                goal of discovering useful information, informing
##                conclusion and supporting decision-making. Data
##                analysis has multiple facets and approaches,
##                encompassing diverse techniques under a variety of
##                names, and is used in different business, science,
##                and social science domains. In today's business
##                world, data analysis plays a role in making
##                decisions more scientific and helping businesses
##                operate more effectively.

59.9 正则表达式(Regular Expression)

59.9.1 字符匹配

在stringr 函数中,pattern参数可以正则表达式的形式表示。在R语言中,正则表达式以字符串形式表示。

‘a’ 在正则表达式中单个字母代表的就是一个字母本身
\.   \?   \(   \}  等 当我们想表示一个符号的时候,以符号本身表示一个符号并在前面加一个斜杠
\n 代表换行
\t 代表一个缩进,即跳格
\s 代表任意空格
\S 代表非空格字符
\d 代表任意数字字符
\D 代表任意非数字字符
\w 代表任意字字符
\W 代表任意非字字符
\b 代表词边界
\B 代表非词边界
[:digit]  代表0-9之间的任意数字
[:alpha]  代表a-z,和A-Z之间的任意字母
[:lower:]  代表a-z之间的任意字母
[:upper:]  代表A-Z之间的任意字母
[:xdigit:]  代表16进制中任意的数字(0-9和A-F)
[:alumn:]  代表任意数字或字母
[:graph:]  代表任意数字,字母,或者符号
[:print:]  代表任意数字,字母,符号,或者空格
[:spcae:]  代表空格,用法与\s相同
[:blank:]  代表空格或者跳格(缩进)但不包括换行
.  代表任意字符除了换行

由于很多常规字符不能直接以字符串的形式来表达,所以我们需要在带有斜杠的正则表达式前面额外加上一个斜杠,使相对应的正则表达式能以字符串的形式储存
例如:
\n 在字符串中的表达为’\\n’
\s 在字符串中的表达为’\\s’
\w 在字符串中的表达为’\\w’
等等

59.9.2 替换(Alternates)

‘|’ 表示或者(or), 例如 ‘ab|d’表示’ab’ 或’d’ 都能被匹配。

‘[ ]’ 表示其中一个,例如’[abd]’表示任意’a’或’b’或’d’都能被匹配。

‘[^]’ 表示除此之外,例如’[^abd]’ 表示除’abd’之外的的子字符串都能被匹配。

‘[-]’ 表示范围,例如’[a-c]‘表示从a至c,即单个子字符串’a’,’b’或者’c’能被匹配。

59.9.3 锚点(Anchors)

‘^’ 表示字符串开头,例如’^a’表示以a开头的字符串为有效匹配。

‘$’ 表示字符串结尾,例如’a$’表示以a结尾的字符串为有效匹配。

59.9.4 查找(Look Arounds)

‘char1(?=char2)’ 表示匹配char1后一个为char2的char1字符,例如‘a(?=c)’表示匹配a后一个为c的a。

‘char1(?!char2)’ 表示匹配char1后一个不为char2的char1字符,例如‘a(?!c)’表示匹配a后一个不为c的a。

‘(?<=char2)char1’ 表示匹配char1前一个为char2的char1字符,例如’(?<=b)a’表示匹配a前一个为b的a。

‘(?<!char2)char1’ 表示匹配char1前一个不为char2的char1字符,例如’(?<!b)a’表示匹配a前一个不为b的a

59.9.5 数量词的使用(Quantifiers)

? 代表前一个正则表达式出现零次或者一次

* 代表前一个正则表达式出现零次或多次

+ 代表前一个正则表达式出现一次或多次

{n} 代表前一个正则表达式出现n次

{n,} 代表前一个正则表达式出现n次或者更多

{n,m} 代表前一个正则表达式出现的次数在n到m之间(包括n和m)

59.9.6 括号划分表达式并用转义号码替换

( ) 将表达式中的一个部分用括号包含代表着括号中的子表达式自成一个组,系统在匹配表达式时,也会根据括号的顺序来匹配

例如: (a)(bb)(cab) 此正则表达式中,第一组子表达式是a,第二组子表达式是bb,第三组表达式是cab,系统在匹配的时候,匹配的循序也就是先匹配一个a,然后两个b,最后再是cab

我们可以通过在数字前加上双斜杠来直接表示对应数字的子表达式
例如:
\\1 在正则表达式中代表第一组子正则表达式
\\\3 在正则表达式中代表第三组子正则表达式
等等

表达式 ‘(a)(b)(c)(c)(b)(a)’ 和 ‘(a)(b)(c)\3\2\1’是相同的
表达式’(aab)(cde)(c)(aab)(c)(cde)‘和’(aab)(cde)(c)\1\3\2’是相同的