R中的字符串处理

1 nchar

作用:可以读取一个字符串的实际长度(字符串内部字符数目)

x<-c('Hello','how are you?')
nchar(x)
y<-c('what are you doing',NA,'I do nothing!',23)
nchar(y)

https://w6.sanwen8.cn/mmbiz/iahsIaCcYABACxH50Yxic7Icq0cwFAMAFpaiaqJBbCK8ZG1UOp70mRDzeXJFkEXRjWFpXHognMZsxUDYHYvwJXEvg/640?wx_fmt=png
2length

作用:返回向量和矩阵中元素的个数,数据框列的个数,列表中的元素个数

a<-1:100#向量
b<-matrix(rnorm(50),5,10)#矩阵
c<-ToothGrowth#数据框
d<-list(a,b,c)#列表
length(a);length(b);length(c);length(d)

https://w6.sanwen8.cn/mmbiz/iahsIaCcYABACxH50Yxic7Icq0cwFAMAFpIUDDJSNBCAfvUHL5esayJxoicIpjWjAeoncOpWng3iabMibG5wU40zZOw/640?wx_fmt=png

读者注意区别ncharlength的差异。前者是字符个数,后者是向量长度。

3tolowertoupper

tolower:将字符串转为小写

toupper:将字符串转为大写

x1<-'ATTGCTACGGACGTT'
x2<-'ATTGCtacgGACGTT'
tolower(x1)
tolower(x2)
y1<-'atgcgtatgcct'
y2<-'atgCGTatgcct'
toupper(y1)
toupper(y2)

https://w6.sanwen8.cn/mmbiz/iahsIaCcYABACxH50Yxic7Icq0cwFAMAFpJoQG31KcCSwSy3wLvp1h0mSq0nctk303IsjUXBOtPYA71sV7icDegsQ/640?wx_fmt=png
4chartr

作用:字符替换(’ --> ''

语法规则chartr(old = ,new = ,x = )

old:被替换的x中的旧字符集合

new:替换处理后,新的字符集合,长度必须大于或等于旧的字符集合

x:字符串或者字符串的对象

x <- "MiXeD cAsE 123"
chartr("iXe", "why", x)
chartr("a-cX", "D-Fw", x)

https://w6.sanwen8.cn/mmbiz/iahsIaCcYABACxH50Yxic7Icq0cwFAMAFp9gGWPxCicbZE2syVrWoDJ96A9M7ZJVP5Sd8goTWOVbuyGRWjV3BnrGA/640?wx_fmt=png
5
casefold

作用:大小写转换的整合版

x<-c('sfjlkDHFGSdklfj')
casefold(x,upper = T)
casefold(x,upper = F)

https://w6.sanwen8.cn/mmbiz/iahsIaCcYABACxH50Yxic7Icq0cwFAMAFpYZ3C7B8T32iavPdqT1AjS6P60Hs2ak5AMn1d9oBIttVJA7GxQQ84DWA/640?wx_fmt=png
6paste

作用:字符串连接,用sep分割

paste(1:12,sep="")
paste(1:12,collapse='')
paste("1st", "2nd", "3rd", collapse = ", ")
paste("1st", "2nd", "3rd", sep = ", ")

https://w6.sanwen8.cn/mmbiz/iahsIaCcYABACxH50Yxic7Icq0cwFAMAFpvdcGjB820fyYmHKs6SxjFZ0LjdMiac5rHmECO8v64TrgKZfwf9Nick4w/640?wx_fmt=png
sep对多个字符向量连接不起作用,想要连接起来,必须用collapse='自己设定分隔符'

注意下面的区别:

x<-1:3
y<-c('a','b','c')
paste(x,y,sep='-')
paste(x,y,collapse = ':')
paste(x,y,sep='-',collapse = ':')

https://w6.sanwen8.cn/mmbiz/iahsIaCcYABACxH50Yxic7Icq0cwFAMAFp24uI6BX65WUDtZYzxTRDjfMg2MWPM7NaAZE2NQgyZcbg3Bm2DNT11A/640?wx_fmt=png

7substrsubstring

substr( )函数和substring( )函数是截取字符串最常用的函数,两个函数功能方面是一样的,只是其中参数设置不同。

substr必须设置参数startstop,如果缺少将出错

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) #
注意查看输出结果
https://w6.sanwen8.cn/mmbiz/iahsIaCcYABACxH50Yxic7Icq0cwFAMAFpfS2ialydz44NzgakDzwNooWzKOH24mLiaWpoicDLmTdppcqDXyjvIozicQ/640?wx_fmt=png
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是当成一个字符来处理的

https://w6.sanwen8.cn/mmbiz/iahsIaCcYABACxH50Yxic7Icq0cwFAMAFptk7pHrSlt82StBF3WLDyZRwsnsribicNH3bzmrRsYdloMHBNf7ibzia2aQ/640?wx_fmt=png
9subgsub

作用:字符串替换,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#
观察一下发现原字符串没有变化
https://w6.sanwen8.cn/mmbiz/iahsIaCcYABACxH50Yxic7Icq0cwFAMAFpesggprFfOVMB9mjKs0qgxKmhpfHg0niaayDQjuGXn9dNyEINrgOERJQ/640?wx_fmt=png
结论:虽然subgsub是用于字符串替换的函数,但严格地说R语言没有字符串替换的函数,因为R语言不管什么操作对参数都是传值不传址,要改变原变量我们只能通过再赋值的方式。

备注:chartr()的替换单位是字符,sun()gsub()的替换单位是字符串。

10grepgrepl

作用:这两个函数返回向量水平的匹配结果,不涉及匹配字符串的详细位置信息。

语法规则

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)

https://w6.sanwen8.cn/mmbiz/iahsIaCcYABACxH50Yxic7Icq0cwFAMAFpcPffnGrIe942MUN77DzwNOIZJyaNzXAm0OLVcws7Pw7GVXu6DD0nTg/640?wx_fmt=png
11regexprgregexprregexec

作用:在字符串中提取出特定的字符串(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;

https://w6.sanwen8.cn/mmbiz/iahsIaCcYABACxH50Yxic7Icq0cwFAMAFpCxfVB2biaf5u4ib8phZ3EnhZUWMkjORXAqLwAyjPAjfKvOMicMApo5sLA/640?wx_fmt=png

备注:gregexpr返回一个列表,在直接读取起始位置时,可以借助b[[1]][1]来表示第一次匹配的结果,b[[1]][2]表示第二次匹配的结果。

 b[[1]][1];b[[1]][2];b[[2]][1]

https://w6.sanwen8.cn/mmbiz/iahsIaCcYABACxH50Yxic7Icq0cwFAMAFp62LGJRIAIK5FBPygdESTaOJsIeH9ia3SQrwfHt6d1mvMV5b5WIxTC2w/640?wx_fmt=png
另外,在直接读取匹配字符串长度时,可以使用attr(b[[1]],'match.length)以向量形式返回两次匹配的字符串长度
https://w6.sanwen8.cn/mmbiz/iahsIaCcYABACxH50Yxic7Icq0cwFAMAFpMbOsYp4y8LRAtyfYsVMVl26LTiaXuPvKw8ZI4oSkT7ic577WSzUAoYMQ/640?wx_fmt=png

最后,如果没有匹配发生,返回值为-1

text <- c("Hello, Robert! Hi, Robert!", "How are you, Robert.")
regexpr(pattern = 'ob',text )
gregexpr(pattern = 'od',text)
regexec(pattern = 'oc',text)

https://w6.sanwen8.cn/mmbiz/iahsIaCcYABACxH50Yxic7Icq0cwFAMAFpIcjtPDcrGE5ERgSicFZiaFXrlD2AZpjN9iaJG7VLaUDgPVZiaL8WrcqQJg/640?wx_fmt=png

12strtrim

作用:将字符串修剪到特定的显示宽度

注意:该函数只能去掉多余的字符不能增加其他额外的字符,如果字符串本身的长度小于width,得到的是原字符串。

https://w6.sanwen8.cn/mmbiz/iahsIaCcYABACxH50Yxic7Icq0cwFAMAFpoLtd8b7JCLiacibJ1BiapNxNKKqia0uffclY9n8BVpZlujD1kJYwgVkOBw/640?wx_fmt=png

13matchcharmatch

match:按向量进行运算,返回第一次匹配的元素的位置,非字符向量也可用。

charmatch:读者自己领会吧(汗)

match(x = 'abc',table = c('dkf','abc','123',456))
charmatch("m",   c("mean", "median", "mode"))
charmatch("med", c("mean", "median", "mode"))

https://w6.sanwen8.cn/mmbiz/iahsIaCcYABACxH50Yxic7Icq0cwFAMAFpKibXcEK9iaeOlZcMlrzaDT6oEOoLibIqgIicfNxGicqVJk60JqCHZLWkMAQ/640?wx_fmt=png
其实字符函数还有很多,这里就不一一描述了。下面针对上述出现的常用字符做个总结:

paste函数:字符串连接

strsplit函数:字符串拆分

grepgrepl函数:字符串查询

regexprgregexprregexec:字符串查询

subgsub函数:字符串替换

substrsubstring函数:字符串提取

tolowertoupper函数:大小写转换

在结尾,我们谈一谈正则表达式,我们进行字符处理时,一般情况下不是精确的处理,而是处理拥有相似规则的一类字符串,这个时候,就需要用到正则表达式。

1、字符类

字符类用于表达多个字符集合内的任意一个字符,我们常用 [ ] 来表示字符集合(和perl中的字符集很像)。

例如:[aeiou]可用于匹配ae i o u单个字符,但是不能匹配“aeiou”

我们还可以给定[ ]一个范围,[0-9]匹配任意一个0~9的数字,[a-z]匹配任意一个小写英文字母。

有些特殊字符可以匹配某类字符集合,.  可以匹配除了\n意外的任意字符,在这里我叫它元字符如果想要匹配点号本身,我们要用\\. 

2、限定符

符号

说明

*

匹配0次以上(包括0次)

+

一次以上,至少一次

01

^

脱字符,匹配开头的元素

$

匹配结尾的元素

n

重复n

n,

n次或n次以上

n,m

重复nm

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

归去来?

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值