1、 nchar
作用:可以读取一个字符串的实际长度(字符串内部字符数目)
x<-c('Hello','how are you?')
nchar(x)
y<-c('what are you doing',NA,'I do nothing!',23)
nchar(y)
2、length
作用:返回向量和矩阵中元素的个数,数据框列的个数,列表中的元素个数
a<-1:100#向量
b<-matrix(rnorm(50),5,10)#矩阵
c<-ToothGrowth#数据框
d<-list(a,b,c)#列表
length(a);length(b);length(c);length(d)
读者注意区别nchar和length的差异。前者是字符个数,后者是向量长度。
3、tolower和toupper
tolower:将字符串转为小写
toupper:将字符串转为大写
x1<-'ATTGCTACGGACGTT'
x2<-'ATTGCtacgGACGTT'
tolower(x1)
tolower(x2)
y1<-'atgcgtatgcct'
y2<-'atgCGTatgcct'
toupper(y1)
toupper(y2)
4、chartr
作用:字符替换(‘旧’ --> '新')
语法规则:chartr(old = ,new = ,x = )
old:被替换的x中的旧字符集合
new:替换处理后,新的字符集合,长度必须大于或等于旧的字符集合
x:字符串或者字符串的对象
x <- "MiXeD cAsE 123"
chartr("iXe", "why", x)
chartr("a-cX", "D-Fw", x)
5、casefold
作用:大小写转换的整合版
x<-c('sfjlkDHFGSdklfj')
casefold(x,upper = T)
casefold(x,upper = F)
6、paste
作用:字符串连接,用sep分割
paste(1:12,sep="")
paste(1:12,collapse='')
paste("1st", "2nd", "3rd", collapse = ", ")
paste("1st", "2nd", "3rd", sep = ", ")
sep对多个字符向量连接不起作用,想要连接起来,必须用collapse='自己设定分隔符'。
注意下面的区别:
x<-1:3
y<-c('a','b','c')
paste(x,y,sep='-')
paste(x,y,collapse = ':')
paste(x,y,sep='-',collapse = ':')
7、substr和substring
substr( )函数和substring( )函数是截取字符串最常用的函数,两个函数功能方面是一样的,只是其中参数设置不同。
substr:必须设置参数start和stop,如果缺少将出错
substring:可以只设置first参数,last参数若不设置,指字符串的最大长度。
语法规则:
substr(x, start, stop)
substring(text, first, last = 1000000L)
substr("abcdef", 2, 4)
substring("abcdef", 1:6, 1:6)
x <- c("asfef", "qwerty", "yuiop[", "b", "stuff.blah.yech")
substr(x, 2, 5)
substring(x, 2, 4:6) # 注意查看输出结果
8、strsplit
作用:用于字符串分割,其中split 是分割参数。所得结果以默认以list形式展示。其中用于分割的字符串将不再出现,分割后的结果可以结合unlist使用。
语法规则:strsplit(x = ,split = ,fixed = ,perl = ,useBytes = )
x:字符串向量
split:分割参数(参数在结果不会出现)
fixed:默认为正则表达式匹配,否则表示使用普通文本匹配
perl:如果正则表达式很长,正确设置表达式并且使用perl=TRUE可以提高运算速度。
useBytes:是否逐个字节进行匹配,默认为FALSE,即按字符而不是字节进行匹配。
text <- "Hello Robert!\nHello Ava!"
strsplit(text,' ')
strsplit(text, "\\s")# 正则表达式
strsplit(text, "")#空字符,长度为0
unlist(strsplit("a.b.c", "[.]"))#正则表达式
unlist(strsplit("a.b.c", "."))
注意:\n是当成一个字符来处理的
9、sub和gsub
作用:字符串替换,gsub是全局替换,sub仅替换遇到的第一个匹配字符。
语法规则
sub(pattern, replacement, x, ignore.case = FALSE, perl = FALSE, fixed = FALSE, useBytes = FALSE)
gsub(pattern, replacement, x, ignore.case = FALSE, perl = FALSE, fixed = FALSE, useBytes = FALSE)
pattern:欲被替换的字符串,可以使用正则表达式
replacement:替代后的字符串
x:原始字符串
text <- "Hello Robert!\nHello Ava!"
sub(pattern = 'Hello',replacement = 'Hi',x = text)
gsub(pattern = 'Hello',replacement = 'Hi',x = text)
text#观察一下发现原字符串没有变化
结论:虽然sub和gsub是用于字符串替换的函数,但严格地说R语言没有字符串替换的函数,因为R语言不管什么操作对参数都是传值不传址,要改变原变量我们只能通过再赋值的方式。
备注:chartr()的替换单位是字符,sun()和gsub()的替换单位是字符串。
10、grep和grepl
作用:这两个函数返回向量水平的匹配结果,不涉及匹配字符串的详细位置信息。
语法规则
grep(pattern, x, ignore.case = FALSE, perl = FALSE, value = FALSE, fixed = FALSE, useBytes = FALSE, invert = FALSE)
grepl(pattern, x, ignore.case = FALSE, perl = FALSE, fixed = FALSE, useBytes = FALSE)
grep:仅返回匹配项的下标
grepl:返回所有的查询结果,并用逻辑向量表示有没有找到匹配
grep(pattern = "[a-z]",x = letters)
grepl(pattern = '[a-z]',x=letters)
11、regexpr、gregexpr和regexec
作用:在字符串中提取出特定的字符串(pattern)的相关信息,其中,pattern可以是字符串,也可以是正则表达式。
regexpr:只查询匹配第一个特定字符
gregexpr:全部查询
text <- c("Hello, Robert! Hi, Robert!", "How are you, Robert.")
a<-regexpr(pattern = 'ob',text )
b<-gregexpr(pattern = 'ob',text)
c<-regexec(pattern = 'ob',text)
a;b;c;
备注:gregexpr返回一个列表,在直接读取起始位置时,可以借助b[[1]][1]来表示第一次匹配的结果,b[[1]][2]表示第二次匹配的结果。
b[[1]][1];b[[1]][2];b[[2]][1]
另外,在直接读取匹配字符串长度时,可以使用attr(b[[1]],'match.length)以向量形式返回两次匹配的字符串长度
最后,如果没有匹配发生,返回值为-1。
text <- c("Hello, Robert! Hi, Robert!", "How are you, Robert.")
regexpr(pattern = 'ob',text )
gregexpr(pattern = 'od',text)
regexec(pattern = 'oc',text)
12、strtrim
作用:将字符串修剪到特定的显示宽度
注意:该函数只能去掉多余的字符不能增加其他额外的字符,如果字符串本身的长度小于width,得到的是原字符串。
13、match和charmatch
match:按向量进行运算,返回第一次匹配的元素的位置,非字符向量也可用。
charmatch:读者自己领会吧(汗)
match(x = 'abc',table = c('dkf','abc','123',456))
charmatch("m", c("mean", "median", "mode"))
charmatch("med", c("mean", "median", "mode"))
其实字符函数还有很多,这里就不一一描述了。下面针对上述出现的常用字符做个总结:
paste函数:字符串连接
strsplit函数:字符串拆分
grep和grepl函数:字符串查询
regexpr、gregexpr和regexec:字符串查询
sub和gsub函数:字符串替换
substr和substring函数:字符串提取
tolower和toupper函数:大小写转换
在结尾,我们谈一谈正则表达式,我们进行字符处理时,一般情况下不是精确的处理,而是处理拥有相似规则的一类字符串,这个时候,就需要用到正则表达式。
1、字符类
字符类用于表达多个字符集合内的任意一个字符,我们常用 [ ] 来表示字符集合(和perl中的字符集很像)。
例如:[aeiou]可用于匹配a、e、 i、 o、 u单个字符,但是不能匹配“aeiou”。
我们还可以给定[ ]一个范围,[0-9]匹配任意一个0~9的数字,[a-z]匹配任意一个小写英文字母。
有些特殊字符可以匹配某类字符集合,. 可以匹配除了\n意外的任意字符,在这里我叫它元字符如果想要匹配点号本身,我们要用\\.
2、限定符
符号 | 说明 |
* | 匹配0次以上(包括0次) |
+ | 一次以上,至少一次 |
? | 0或1 |
^ | 脱字符,匹配开头的元素 |
$ | 匹配结尾的元素 |
{n} | 重复n次 |
{n,} | n次或n次以上 |
{n,m} | 重复n到m次 |