科学研究中有时候咱们收集到的数据很乱,不能马上进行分析,如SEER数据,用过都知道,咱们需要对数据进行清洗,从数据中提取咱们需要的东西,才能进行分析,这时候有个有用的东西叫正则式,对于我们在字符串中提取数据非常实用,咱们分几章来介绍一下,今天讲讲正则式的基础,介绍一下常用的函数。
正则式各个语言的用法都差不多,今天来介绍一下常用的正则式函数,开始可能学得有点费力,但是你想学好R这是避不开的上坡路。
1. grep函数
grep(pattern,x)语句在字符串向量x里搜索给定子字符串pattern。如果x有n个元素,即包含n个字符串,则grep(pattern,x)会返回一个长度不超过n的向量。
看下面例子,简单来说就是grep函数在c(“Equator” ,“North Pole” , “South Pole” )这堆字符中搜索包含有Pole字符的内容,结果返回了位置,第二和第三个字符串符合。
grep("Pole",c("Equator" ,"North Pole" , "South Pole" ))
咱们把Pole的大写P换成小写p看看,这回就没有符合条件的,搜不到了
grep("pole",c("Equator" ,"North Pole" , "South Pole" ))
Grep函数有个延申函数,grepl函数,它返回的是T或者F,这个在编程中是很有用的,以后有空再说说。
grepl("Pole",c("Equator" ,"North Pole" , "South Pole" ))
Grep函数是查到需要字符的位置,而sub函数可以对查到的字符进行替换,但是在同一个字符串中相同的字符只替换第一个
我们把字符中的o替换成8,这里注意一下North Pole有两个o,只是替换了第一个
sub("o",8,c("Equator" ,"North Pole" , "South Pole" ))
而gsub函数只要匹配得上会全部替换
gsub("o",8,c("Equator" ,"North Pole" , "South Pole" ))
2. nchar函数
这个函数可以帮助我们计算字符中的字节或长度
可以看到函数算出了每个字符串的长度
x <- c("asfef", "qwerty", "yuiop[", "b", "stuff.blah.yech")
nchar(x)
还需要注意一点,如果x不是字符形式,nchar()会得到不可预料的结果。
3. paste函数
paste函数主要是把两个字符连接起来,有paste和paste0两种函数,用法抖差不多,在编程中paste函数可以说是应用得非常广泛,这里简单介绍一下。
咱们看到默认得连接符是空格,通过sep这个连接符不同得设置,得到得结果也是不同的。
paste("North" ,"Pole")
paste("North","Pole",sep="")
paste("North" ,"Pole",sep=".")
paste("North" ,"and" ,"South" ,"Poles")
4. sprintf函数
sprtintf函数可以把多个变量组成在一起,变成一个新的字符串,咱们在画森林图的时候,经常使用到这个函数。配合ifelse这个函数,用得效果很好。
i<-10
sprintf( "the square of %d is %d" ,i,i^2)
这个函数和上面几个函数稍有不同,我来解释一下,两个%d得部分等下是要被替换得,后面的i和i^2就是来替换两个%d的。这里有一些规则,d代表的是数字,s代表字符串,%d代表这个替换的是数字,%s表示替换的是字符
a <- "零基础说科研"
sprintf("This official account is %s",a)
如果你对表示的数字小数点有要求,可以使用%f来表示数字,下面是一些用法,自己体会一下
sprintf("%f", pi)
sprintf("%.3f", pi)
sprintf("%1.0f", pi)
sprintf("%5.1f", pi)
sprintf("%05.1f", pi)
sprintf("%+f", pi)
sprintf("% f", pi)
sprintf("%-10f", pi) # left justified
5. substr函数
这个函数主要是通过字符串的位置对字符进行提取,必须输入开始位置和结束位置
substr("abcdef", 2, 4)
意思是提取从第二个字符开始,到第四个字符中的内容,所以提取了bcd.
substr 函数还延申了一个substring函数,,相对于substr函数,substring函数函数只用输入开始位置,不用输入结束位置,它会自己默认为1000000位。
substring("abcdef",2)
咱们在文章《R语言forestploter包优雅的绘制孟德尔随机化研究森林图》中曾经使用stringr包的str_sub函数提取可信区间的数值,substr函数也一样可以做到,有兴趣的可以试一下,大家看这两个函数是不是很相似,就是位置互换一下。
6. strsplit函数
strsplit(x,split)函数根据x中的字符串split把字符串x拆分成若干子字符串。
可以看到被从e斩开了
x <- c(as = "asfef", qu = "qwerty", "yuiop[", "b", "stuff.blah.yech")
strsplit(x, "e")
这里我们可以扩展一下,空格也算一个字符,这样咱们可以写个小程序
strReverse <- function(x) sapply(lapply(strsplit(x, NULL), rev), paste, collapse = "")
咱们可以看一下,我们先用NULL把字符断开,就可以达到分割字符效果
strsplit(c("abc"),NULL)
接着我们使用lapply(strsplit(x, NULL), rev)把字符反转最后连接,可以得到字符反转的效果
strReverse(c("abc", "零基础说科研"))
下面咱们来深入一点
表示提取有a或u字符的内容
grep("[au]",c("Equator" , "North Pole" ,"South Pole"))
这里表示提取o开头,中间不限,e结尾的内容。第二和第三符合
grep("o.e",c("Equator" , "North Pole" , "South Pole"))
这句和上句相同,但是有两个点号,表示这是个4个字符的内容,只有2符合
grep("N..t",c("Equator" , "North Pole" , "South Pole"))
我们看到"abc" , “de”,"f.g"这三个字符中有点是含有点符号(.)的,假如咱们想提取有点符号(.)的内容怎么办,下面这样是错的
grep(".",c( "abc" , "de","f.g"))
因为点号属于一个字符,所以咱们要给他加个\来脱离字符的意思,那为什么下面咱们要加两个\呢,因为\也算一个字符,咱们还需要再加一个字符使它来脱离字符的意思,听起来有点拗口,有点难理解,不急,后面章节咱们会慢慢解释。
grep("\\.",c( "abc" , "de","f.g"))
今天咱们初步介绍了一些正则式的基础函数和内容,后面慢慢深入,未完待续。