轉(zhuǎn)自:http:///archives/26 R通常被用來進行數(shù)值計算比較多,,字符串處理相對較少,而且關(guān)于字符串的函數(shù)也不多,,用得多的就是substr,、strsplit、paste、regexpr這幾個了,。實際上R關(guān)于字符串處理的功能是非常強大的,,因為它甚至可以直接使用Perl的正則表達式,這也是R的一個理念,,作為語言就把向量計算做到極致,,作為環(huán)境,就在各領(lǐng)域都集成最好的,。R中有g(shù)rep系列的函數(shù),,可以用最強大的方式處理字符串的所有問題。 grep的全稱是global search regular expression and print out the line,,是Unix下一種強大的文本搜索工具,,可以通過正則表達式搜索文本,并把匹配的行打印出來,,包括grep,、egrep和fgrep(egrep是擴展的grep,fgrep是快速的搜尋方式并沒有真正利用正則表達式),。Linux下使用GNU版的grep,,該套規(guī)范也被廣泛地使用,R中的grep函數(shù)就是其中之一,。 grep的核心就是正則表達式(Regular Expressions,,通常縮寫為regex),,所謂正則表達式,,就是用某種模式去匹配一類字符串的一個公式,很多文本編輯器或者程序語言都支持該方式進行字符串的操作,,最開始是由上文介紹的Unix工具grep之類普及的,,后來得到廣泛應(yīng)用。尤其是Perl語言中將正則表達式發(fā)揮到了極致,。 R中的正則表達式非常專業(yè),,從grep系列函數(shù)的參數(shù)就可以看出,有個參數(shù)“extended”,,默認為T,,表示使用擴展grep,也就是egrep,,如果選擇為F就表示基礎(chǔ)的grep,,不過該種方式不被R推薦,即使使用了也會出現(xiàn)警告,,實際上grep能做的egrep也都能做,,而且還要簡單不少,。我剛開始在egrep中使用總是不能通過,后來發(fā)現(xiàn)其實egrep中更簡單,,很多時候直接寫在[]內(nèi)就行,。還有一個參數(shù)“perl”,默認為F,,如果選擇T表示使用Perl的正則表達式規(guī)則,,功能更加強大,不過如果沒有專門學(xué)過Perl語言的話用egrep也就夠了,。另一個參數(shù)“fixed”雖然描述的不是同一個東西,,但是也很相關(guān),選擇之后就會進行精確的匹配,,不再使用正則表達式的規(guī)則,,在效率上會快很多,我覺得這個可能就是fgrep,。R的幫助文檔中也明確說明了這三個參數(shù)實際上代表了四種模式,,常規(guī)grep、擴展grep,、Perl正則表達式,、精確匹配,使用者可以根據(jù)具體的含義選擇自己需要的,,如果參數(shù)設(shè)置互有沖突,,會自動忽略后面的參數(shù),并會在Warning中明確指出,。 grep系列函數(shù)其實包括grep,、grepl、sub,、gsub,、regexpr,、gregexpr,,他們的參數(shù)很類似,在R中也是把幫助文檔集成在了一起,,查找任意一個都會得到一個統(tǒng)一的文檔,。里面對各個參數(shù)也是一起介紹的,除了剛才說的三個以外,,第一個參數(shù)就是最重要的“pattern”,,這是一個字符串,直接表示正則表達式,,根據(jù)模式的不同注意規(guī)則就行,,另外有個“x”表示要查找的向量,,這也是R中的獨特之處,不是查找文件,,而是查找向量,,該處也可以只輸入一個字符串,就成了基礎(chǔ)的字符串處理函數(shù),。對于grep函數(shù),,結(jié)果只有匹配或者不匹配,因此匹配時輸出向量中該元素的下標,,如果是單個字符就輸出1,,對于grepl,和grep其實一樣,,不過輸出的是邏輯值,,匹配就是T,不匹配就是F,。參數(shù)“value”默認為F,,輸出的值就是剛才說的元素下標或者邏輯值,如果改成T,,就會輸出查找的字符串,。還有一個參數(shù)“ignore.case”,默認是F,,表示大小寫敏感,,可以改為T,表示大小寫不敏感,。參數(shù)“useBytes”默認是F,,表示按字符查找,如果是T則表示按字節(jié)查找,,對于中文字符影響還是很大的,。參數(shù)“invert ”默認為F,表示正常的查找,,如果為T則查找模式的補集,。像sub和gsub這樣的替換函數(shù),還多一個參數(shù)“replacement”,,用來表示替換的字符,。 這些函數(shù)的參數(shù)都比較類似,但是輸出各不一樣,,grep輸出向量的下標,,實際上就是找到與沒找到,grepl返回的邏輯值更能說明問題,。sub是一個很強大的替換函數(shù),,遠勝過substr,,正則表達式中可以設(shè)置非常靈活的規(guī)則,然后返回被替換后的字符串,,如果正則表達式寫得好,,基本可以解決所有子字符串的問題。sub函數(shù)和gsub函數(shù)唯一的差別在于前者匹配第一次符合模式的字符串,,后者匹配所有符合模式的字符串,,也就是說在替換的時候前者只替換第一次符合的,后者替換所有符合的,。regexpr和gregexpr被使用的似乎比較多,,因為它們很像其他語言中的instr函數(shù),可以查找到某些字符在字符串中出現(xiàn)的位置,,不過我覺得用處并不是很大,,因為通常情況下尋找某字符位置的目的就是為了做相關(guān)處理,而sub都能搞定,。regexpr和gregexpr的關(guān)系和sub與gsub差不多,,gregexpr操作向量時會返回列表。 以上就是grep系列函數(shù)的一些用法,,根據(jù)例子可以很方便地使用,,個人建議使用參數(shù)“pattern”和“x”就行(sub和gsub當(dāng)然還有replacement),其他的都用默認的,。在pattern中按照egrep的規(guī)則寫正則表達式,,基本上可以解決所有的字符串處理問題。只需要對正則表達式有簡單的了解,,就可以得到R中這些強大的功能,。關(guān)于正則表達式的用法就在后文中分解了。 |
|