49.关于字符串的基础知识和一些字符串操作函数
【上一篇:48.关于Set Operations-集合操作函数】
【下一篇:50.关于正则表达式的基础知识】
字符串基础
1. 字符串的创建必须用单引号或者双引号,两者作用相同
2. 特例是:如果字符串中包含单引号或双引号,最好用另外一种引用字符,即如果字符串中有双引号,则引用字符用单引号;如果字符串中有单引号,则引用字符用双引号。当然,也可以用反斜杠对字符串中的引号进行转义,这样就不需要考虑引用字符用单引号还是双引号的问题了。
3. print函数打印出的字符串都是用双引号括起来的,同时显示转义字符;writeLines()函数可以输出raw string。
4. ?'"'命令可以打印引号的帮助文档,其中包括一些特殊字符,包括转义字符等的描述。
5. Base R中也有很多字符串处理函数,包括length()、paste()、paste0()等,但inconsistent。stringr包中的字符串处理函数比较consistent,容易记忆,且函数名很直观,都是以str_开头。stringr包也是tidyverse的核包之一。
> (a<-"'")
[1] "'"
> (b<-'"')
[1] "\""
> (b<-"\"")
[1] "\""
> (c<-"\n")
[1] "\n"
# 这里打印一个空行
> writeLines(c)
>
一些基本的字符串处理函数
str_length:输入为字符向量;输出为数字向量,向量元素为字符向量中每个元素的长度。NA元素的长度为NA
str_length(string)
> a<-c("ABC","DEFC","FFFFF")
> str_length(a)
[1] 3 4 5
> b<-"ABC"
> str_length(b)
[1] 3
str_c(string combination):输入为一个或多个字符向量,输出为一个字符向量或一个长度为1的字符串。str_c()函数只有两个参数,其中sep指定多个向量之间元素的拼接符,应用sep之后返回一个字符向量,collapse(当collapse不为NULL时)基于应用sep之后的结果,指定连接字符向量的元素的字符,最终返回一个长度为1的字符串。
str_c(..., sep = "", collapse = NULL)
1)当输入只有一个字符向量时,sep参数不会起作用(因为其用于多个向量之间元素的拼接),
collapse会发生作用,可设置。
> a<-c("a","b","c")
> str_c(a,collapse = "")
[1] "abc"
2)当输入两个或多个长度相同的字符向量时,sep参数起作用,如果collapse=NULL,则结果为向量
> b<-c(1,2,3)
> c<-c("A","B","C")
> str_c(a,b,c)
[1] "a1A" "b2B" "c3C"
3)基于2),如果collapse=设置一个字符,则结果为长度为1的字符串
> str_c(a,b,c,collapse = "-")
[1] "a1A-b2B-c3C"
4)如果输入的两个或多个向量长度不同,则函数将短向量循环延伸跟最长向量长度一致,再拼接
> str_c("ex",b,c)
[1] "ex1A" "ex2B" "ex3C"
str_replace_na:将缺失值NA转换成字符串"NA"。
> str_replace_na(c(NA, "abc", "def"))
[1] "NA" "abc" "def"
str_sub(string subsetting):输入是字符向量,可实现字符串截取和字符替换;输出是字符串向量。对取子集,参数只有start和end,用来指定取子集范围;对字符串替换,增加omit_na参数考虑NA的情况。
str_sub(string, start = 1L, end = -1L)
str_sub(string, start = 1L, end = -1L, omit_na = FALSE) <- value
默认start=1,end=-1,负值表示从字符串末尾开始的位置。1-based,左闭右闭区间。
对所有参数,包括string,start,end,value,函数循环参数元素使其与最长的参数长度一致。
如果字符向量元素不够长,则有多长就打印多长即可,也就是在元素长度和设置长度之间取最小值
# string,start,end长度均为1
> str_sub("ABCDEFG",start=2,end=4)
[1] "BCD"
# string,start,end等长,且长度都为3
> str_sub(c("ABCDEFG","abcde","123456789"),c(2,3,4),c(5,4,-1))
[1] "BCDE" "cd" "456789"
#string,start,end不等长,自动循环至最长
> str_sub(c("ABCDEFG","abcde","123456789"),c(2,3),5)
[1] "BCDE" "cde" "2345"
Warning message:
In stri_sub(string, from = start, to = end) :
longer object length is not a multiple of shorter object length
# 没错,不等长在某些情况下会有警告,所以随机应变
> str_sub(x,c(2,3),5) <- c("OO","PP","QQ")
Warning message:
In `stri_sub<-`(`*tmp*`, from = start, to = end, omit_na = omit_na, :
longer object length is not a multiple of shorter object length
> x
[1] "AOOFG" "abPP" "1QQ6789"
str_to_lower、str_to_upper、str_to_title:字符串大小写转换,输入为字符向量,输出向量。
# 字母全部转成大写
str_to_upper(string, locale = "en")
# 字母全部转成小写
str_to_lower(string, locale = "en")
# title为单词首字母大写,英文标题的形式
str_to_title(string, locale = "en")
# 句子的第一个单词的第一个字母大写,英文字母的形式
str_to_sentence(string, locale = "en")
locale参数指定语言,默认是英语。各种语言大小写的表示当然不同。
locale被指定为ISO 639语言代码,是两个或三个字母的缩写
https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes
str_sort、str_order:排序,输入是字符串向量,对向量的元素进行排序后,str_sort输出排序后的结果,str_order输出排序后值对应的索引。很好理解。
可以设置升序或降序排列,默认是升序
na_last指定NA值是否放在最后,默认TRUE
locale默认是英语
numeric:是否按数字排序,默认是字符串
str_order(x, decreasing = FALSE, na_last = TRUE, locale = "en",
numeric = FALSE, ...)
str_sort(x, decreasing = FALSE, na_last = TRUE, locale = "en",
numeric = FALSE, ...)
str_wrap:将字符串包装成格式良好的段落。输入是字符向量,功能包括设置段落每一行的宽度,第一行缩进,除第一行外的其他号缩进。对段落进行格式化也是有算法的。
str_wrap(string, width = 80, indent = 0, exdent = 0)
width:每行的宽度,正整数,如果<=1,则每个单词一行
indent:设置第一行的缩进(indentation),非负整数
exdent:设置除第一行外的其他行的缩进,非负整数
str_trim:去除字符串开始位置和结束位置处的空白符。
str_trim(string, side = c("both", "left", "right"))
可以指定只去除左边或右边的空白符
str_squish(string)
str_squish用来将字符串内部超过一个空白符的地方都变成一个空白符