渢空 发表于 2015-7-7 23:50:18

R语言数据出--文本处理(字符串的分离与合并)

利用R语言处理字符串的分离与合并主要运用的是:strsplite()(字符串的分离) 和paste()(字符串的合并)这两个函数。
这两函数的具体参数如下:
strsplit(x, split, fixed = FALSE, perl = FALSE, useBytes = FALSE)
#x是要分割的字符串
#split是分割符,如果split="",则会对字符串逐个进行分割如:
a="abcd efg"
strsplit(a,split = " ") #以空格为分隔符
strsplit(a,split = "")#逐个字符进行分割paste (..., sep = " ", collapse = NULL)
sep是每个元素合并的连接符
collapse是将一个字符向量合并成一个元素时的连接符例如:
a=c("A","B","C")
paste(a,"d",sep = "")
#这里"d"会做循环3次来满足a中的向量元素,然后合并成一个拥有3个元素的向量
a=c("A","B","C")
paste(a,collapse = "")
#这个代码会将a中的三个元素合并成一个如果需要对某个字符串中的每个元素进行操作,可以将这两个函数一起使用实现向量操作,从而避免利用for循环来提取每一个字符,以提高工作效率。
例如:
a=sample(c(letters,LETTERS),size = 10000,replace = T)
a=paste(a,collapse = "")
#a是一个很长的字符串现在要实现将a中每一小写字母变成大写,将每一大写字母变成小写。
如果利用for循环,那么代码是这样的:
for(i in 1:nchar(a)){
    if(substr(x = a,start = i,stop = i)!=toupper(substr(x = a,start = i,stop = i))){
         substr(x = a,start = i,stop = i)=toupper(substr(x = a,start = i,stop = i))
   }else{
         substr(x = a,start = i,stop = i)=tolower(substr(x = a,start = i,stop = i))
   }
}我们利用system.time()函数观测一下这串代码的运行时间:

现在我们利用strsplite()和paste()结合处理
#首先定义一个函数实现大小写转换
turn=function(x){
    if(x==toupper(x)){
          x=tolower(x)
   }else{
          x=toupper(x)
   }
    x
}
#然后将a进行分离
b=unlist(strsplit(a,split = ""))    #由于strsplit函数结果会以列表返回,这里我们将其变成向量,方便后续处理
b=sapply(b, turn,USE.NAMES = F)   #利用sapply函数避免for循环
b=paste(b,collapse = "")      #最后在合并还原所得到同样的结果,现在我们来看看运行这串代码所用的时间:

这种方式效率明显高出for循环太多。
页: [1]
查看完整版本: R语言数据出--文本处理(字符串的分离与合并)