注:\r\n是windows所用的文本行结束符,Unix和Linux只是用一个换行符来结束一个文本行
匹配数字与非数字 \d 任何一个数字字符,等价于[0-9]
\D 任何一个非数字字符,等价于1
匹配字母\非字母与数字 \w 任何一个字母数字字符(大小写均可以)或下划线字符(等价于[a-zA-Z0-9])
\W 任何一个非字母数字或下划线字符(等价于[^a-zA-Z0-9])
a<-c(“abc\x9422”,‘女’,‘男’,‘女’)
6)完整的表达式
b<-function§{sub("\\x\d{2}",’’,sub("\"","",deparse§)}
a2<-unlist(lapply(a,FUN=b))
a2
[1] “abc22” “女” “男” “女”
a <- c(“2016-2-7”,“2016-3-8”,“2016-4-9”,“2017-5-10”)
b <- c(“ahdbca”,“bhdafb”)
nchar(a) # 计算字符串中字符个数
paste(a,b,sep="–") # 对应拼接
paste(a,collapse =" “) # 拼接成一个字符串
paste(a,b,sep=”–",collapse =" ") # 两步合成一步
strsplit(a,split="-") # 拆分
strsplit(a,split="-\d-",fixed=F) # 使用正则表达式拆分
q <- c(“a-b.c-d”)
strsplit(q,"\.|-") # “a” “b” “c” “d”
(c <- toupper(b))
tolower©
casefold©
casefold(b,upper=T)
chartr(“ab”,“mn”,b) # 对应替换,不支持正则表达式
gsub(pattern="-\d-",replacement=“B”,a) # 搜索匹配的内容替换全部
sub(pattern="-",replacement=“B”,a) # 搜索匹配的内容,只替换第一个
二、字符串连接
paste应该是R中最常用字符串函数了,也是R字符串处理函数里面非常纯的不使用正则表达式的函数(因为用不着)。它相当于其他语言的strjoin,但是功能更强大。它把向量连成字串向量,其他类型的数据会转成向量,但不一定是你要的结果:
paste(“CK”, 1:6, sep="")
[1] “CK1” “CK2” “CK3” “CK4” “CK5” “CK6”
x
y
paste(x, y, sep="-") #较短的向量被循环使用
[1] “aaa-1” “bbb-2” “ccc-1”
z
paste(“T”, z, sep=" #这样的结果不知合不合用
[1] “T:list(a = \\“aaa\\”, b = \\“bbb\\”, c = \\“ccc\\”)”
[2] “T:list(d = 1, e = 2)”
短向量重复使用,列表数据只有一级列表能有好的表现,能不能用看自己需要。会得到什么样的结果是可以预知的,用as.character函数看吧,这又是一个字符串处理函数:
as.character(x)
[1] “aaa” “bbb” “ccc”
as.character(z)
[1] “list(a = \\“aaa\\”, b = \\“bbb\\”, c = \\“ccc\\”)”
[2] “list(d = 1, e = 2)”
paste函数还有一个用法,设置collapse参数,连成一个字符串:
paste(x, y, sep="-", collapse=’; ‘)
[1] “aaa-1; bbb-2; ccc-1”
paste(x, collapse=’; ')
[1] “aaa; bbb; ccc”
三、字符串拆分
strsplit函数使用正则表达式,使用格式为:strsplit(x, split, fixed = FALSE, perl = FALSE, useBytes = FALSE)
参数x为字串向量,每个元素都将单独进行拆分。
参数split为拆分位置的字串向量,默认为正则表达式匹配(fixed=FALSE)。如果你没接触过正则表达式,设置fixed=TRUE,表示使用普通文本匹配或正则表达式的精确匹配。普通文本的运算速度快。
perl=TRUE/FALSE的设置和perl语言版本有关,如果正则表达式很长,正确设置表达式并且使用perl=TRUE可以提高运算速度。
参数useBytes设置是否逐个字节进行匹配,默认为FALSE,即按字符而不是字节进行匹配。
下面的例子把一句话按空格拆分为单词:
text <- “Hello Adam!\\nHello Ava!”
strsplit(text, ’ ')
[[1]]
[1] “Hello” “Adam!\\nHello” “Ava!”
R语言的字符串事实上也是正则表达式,上面文本中的\\n在图形输出中是被解释为换行符的。
strsplit(text, ‘\\\\s’)oracle视频教程
[[1]]
[1] “Hello” “Adam!” “Hello” “Ava!”
strsplit得到的结果是列表,后面要怎么处理就得看情况而定了:
class(strsplit(text, ‘\\\\s’))
[1] “list”
有一种情况很特殊:如果split参数的字符长度为0,得到的结果就是一个个的字符:
strsplit(text, ‘’)
[[1]]
[1] “H” “e” “l” “l” “o” " " “A” “d” “a” “m” “!” “\\n” “H” “e” “l” “l”
[17] “o” " " “A” “v” “a” “!”
五、字符串替换
虽然sub和gsub是用于字符串替换的函数,但严格地说R语言没有字符串替换的函数,因为R语言不管什么操作对参数都是传值不传址。
text
[1] “Hello Adam!\\nHello Ava!”
sub(pattern=“Adam”, replacement=“world”, text) oracle视频
[1] “Hello world!\\nHello Ava!”
text
[1] “Hello Adam!\\nHello Ava!”
可以看到:虽然说是“替换”,但原字符串并没有改变,要改变原变量我们只能通过再赋值的方式。
sub和gsub的区别是前者只做一次替换(不管有几次匹配),而gsub把满足条件的匹配都做替换:
sub(pattern=“Adam|Ava”, replacement=“world”, text)
[1] “Hello world!\\nHello Ava!”
gsub(pattern=“Adam|Ava”, replacement=“world”, text)
[1] “Hello world!\\nHello world!”
sub和gsub函数可以使用提取表达式(转义字符+数字)让部分变成全部:
sub(pattern=".(Adam).", replacement="\\\\1", text)
[1] “Adam”
举个例子:
a<-c(“apple”,“banana”,“pear”,“peach”)
print(a[1])
[1] “apple”
b<-collapse(a,sep = “,”) #注意:collapse()函数在glue模块中
print(b[1])
[1] “apple,banana,pear,peach”
因为数据框的列本来就是一个一个的向量,所以我们可以在使用paste进行字符串粘贴的过程中,
设置collapse = “(和paste的sep相同的一个符号)”,就能完全变成一个了。
5.特定格式搜索与替换:sub(pattern,replacement,x,ignore.case = F, fixed = F)
举个例子:
ss<-“Today is Monday”
sub(“is”,"=",ss)
[1] “Today = Monday”
ss<-“Today is Monday”
sub("\s","(ws)",ss)
[1] "Today(ws)is Monday
ss<-“Today is Monday,is sunny”
sub(“is”,"=",ss)
[1] “Today = Monday,is sunny”
问题也出来了,为什么第二个空白键没有被识别出来?
paste()与paste0():连接字符串
paste()不仅可以连接多个字符串,还可以将对象自动转换为字符串再相连,另外它还能处理向量,所以功能更强大。
paste(“fitbit”, month, “.jpg”, sep="")
这个函数的特殊地方在于默认的分隔符是空格,所以必须指定sep="",这样如果month=10时,就会生成fitbit10.jpg这样的字符串。
另外还有一个paste0函数,默认就是sep=""
所以paste0(“fitbit”, month, “.jpg”)就与前面的代码简洁一点了。
要生成12个月的fitbit文件名:
paste(“fitbit”, 1:12, “.jpg”, sep = “”)
[1] “fitbit1.jpg” “fitbit2.jpg” “fitbit3.jpg” “fitbit4.jpg” “fitbit5.jpg” “fitbit6.jpg” “fitbit7.jpg”
[8] “fitbit8.jpg” “fitbit9.jpg” “fitbit10.jpg” “fitbit11.jpg” “fitbit12.jpg”
可以看出参数里面有向量时的捉对拼接的效果,如果某个向量较短,就自动补齐:
a <- c(“甲”,“乙”,“丙”, “丁”,“戊”,“己”,“庚”,“辛”,“壬”,“癸”)
b <- c(“子”,“丑”,“寅”,“卯”,“辰”,“巳”,“午”,“未”,“申”,“酉”,“戌”,“亥”)
paste0(a, b)
[1] “甲子” “乙丑” “丙寅” “丁卯” “戊辰” “己巳” “庚午” “辛未” “壬申” “癸酉” “甲戌” “乙亥”
paste还有一个collapse参数,可以把这些字符串拼成一个长字符串,而不是放在一个向量中。
paste(“fitbit”, 1:3, “.jpg”, sep = “”, collapse = "; ")
[1] “fitbit1.jpg; fitbit2.jpg; fitbit3.jpg”
nchar():求字符个数
nchar()能够获取字符串的长度,它和length()的结果是有区别的。
nchar(c(“abc”, “abcd”)) #求字符串中的字符个数,返回向量c(3, 4)
length(c(“abc”, “abcd”)) #返回2,向量中元素的个数
注意nchar(NA)返回2
tolower(x) 和toupper(x) :大小写转换。
不用多说。
strsplit:字符串分割
strsplit(“2014-10-30 2262 10367 7.4 18 1231 77 88 44”, split=" ")
[[1]]
[1] “2014-10-30” “2262” “10367” “7.4” “18” “1231” “77” “88” “44”
实际上这个函数支持非常强大的正则表达式。
substr与substring:提取子串
substr(“abcdef”, 2, 4)
[1] “bcd”
substr(c(“abcdef”, “ghijkl”), 2, 4)
[1] “bcd” “hij”
substr(“abcdef”, 1:6, 1:6)
[1] “a”
注意还有一个substring函数,效果就不一样了:
substring(“abcdef”,1:6,1:6)
[1] “a” “b” “c” “d” “e” “f”
区别是:substr返回的字串个数等于第一个参数的长度
而substring返回字串个数等于三个参数中最长向量长度,短向量循环使用。
substr(“123456789”, c(2, 3), c(4, 5, 6)) #等价于:substr(“123456789”, 2, 4)
[1] “234”
substring(“123456789”, c(2, 3), c(4,5,6)) #最长的向量长度为3,其它向量都循环补齐
[1] “234” “345” “23456”
6 字符串替换
6.1 sub和gsub函数
虽然sub和gsub是用于字符串替换的函数,但严格地说R语言没有字符串替换的函数,因为R语言不管什么操作对参数都是传值不传址。
text
sub(pattern = “Adam”, replacement = “world”, text)
text
可以看到:虽然说是“替换”,但原字符串并没有改变,要改变原变量我们只能通过再赋值的方式。 sub和gsub的区别是前者只做一次替换(不管有几次匹配),而gsub把满足条件的匹配都做替换:
sub(pattern = “Adam|Ava”, replacement = “world”, text)
gsub(pattern = “Adam|Ava”, replacement = “world”, text)
sub和gsub函数可以使用提取表达式(转义字符+数字)让部分变成全部:
sub(pattern = “.(Adam).”, replacement = “\1”, text)
7 字符串提取 用regexpr、gregexpr或regexec函数获得位置信息后再进行字符串提取的操作可以自己试试看。
据说还有一个stringr包,将原本的字符处理函数进行了打包,统一了函数名和参数。在增强功能基础上,还能处理向量化数据并兼容非字符数据。stringr包号称能让处理字符的时间减少95%。下面将其中的一些主要函数罗列一下。
library(stringr)
fruit <- c(“apple”,“banana”,“pear”,“pinapple”)
res <- str_c(1:4,fruit,sep=’ ‘,collapse=’ ')
str_c('I want to buy ‘,res,collapse=’ ')
str_length(c(“i”,“like”,“programming R”,123,res))
str_sub(fruit,1,3)
capital <-toupper(str_sub(fruit,1,1))
str_sub(fruit,rep(1,4),rep(1,4))<- capital
str_dup(fruit,c(1,2,3,4))
str_pad(fruit,10,“both”)
str_trim(fruit)
str_detect(fruit,“a$”)
str_detect(fruit,"[aeiou]")
str_locate(fruit,“a”)
str_extract(fruit,"[a-z]+")
str_match(fruit,"[a-z]+")
str_replace(fruit,"[aeiou]","-")
str_split(res," ")
0-9 ↩︎