討論學(xué)習(xí)R的grepl函數(shù),附代碼

俗話說(shuō),“獨(dú)學(xué)而無(wú)友,則孤陋而寡聞”。

為了方便大家交流學(xué)習(xí),共同進(jìn)步,我特地創(chuàng)建了?生信交流群?

廢話不多說(shuō),我們來(lái)聊聊今天的正題。昨天有位群友在群里提出了這樣一個(gè)問(wèn)題

具體的字符串向量是這樣的,需要達(dá)到的目的就是,看字符串向量里面的每一個(gè)元素是否包含"LIPE2"這個(gè)基因。這里的字符串向量有四個(gè)元素。

實(shí)現(xiàn)的手段就是通過(guò)R的grepl函數(shù)

這個(gè)函數(shù)里的pattern是匹配的模式,也就是我們經(jīng)常聽(tīng)到的正則表達(dá)式。如果對(duì)正則表達(dá)式還不了解的小伙伴,可以參考?正則表達(dá)式?。x就是要查看是否滿(mǎn)足pattern的字符串向量,如果匹配pattern就返回TRUE,不滿(mǎn)足就返回FASLE。

這位群友所提出的問(wèn)題,tricky的地方在于LIPE2這個(gè)基因有時(shí)候存在于字符串的中間,有時(shí)候存在于開(kāi)頭,有時(shí)候又存在于末尾,并且還需要考慮一些干擾項(xiàng)比如LIPE23這個(gè)基因也能夠匹配LIPE2,似乎很難通過(guò)一個(gè)正則表達(dá)式來(lái)實(shí)現(xiàn)。后來(lái)這位群友自己解決了這個(gè)問(wèn)題,方法就是通過(guò)或來(lái)實(shí)現(xiàn)。既然一個(gè)正則表達(dá)式無(wú)法滿(mǎn)足需要,那就多寫(xiě)幾個(gè)正則表達(dá)式,把所有可能的情況都考慮進(jìn)去。

這個(gè)問(wèn)題引起了群里關(guān)于正則表達(dá)式激烈的討論,

其實(shí),在這個(gè)群友提出這個(gè)問(wèn)題之前,我還不太確定,pattern里面可以使用或(|),通過(guò)討論大家都有所收獲,至少群里的其他小伙伴知道了正則表達(dá)式這個(gè)概念。以后遇到相似的問(wèn)題,也知道怎么解決了。

今天我又仔細(xì)的研究了一下,給出了三種實(shí)現(xiàn)的方法,供大家交流學(xué)習(xí)。我又加入了一個(gè)干擾項(xiàng),讓這個(gè)正則表達(dá)式更全面。

s <- c("ABCLIPE2", #LIPE2前面有干擾
       "LIPE-AS1,LIPE,CXCL17",
       "LIPE-AS1,LIPE2,LIPE,CXCL17", #LIPE2在中間,前后都有,
       "LIPE2",  #LIPE2在字符串的開(kāi)始,或者結(jié)尾
       "LIPE23")  #LIPE2后面有干擾

方法一,直接匹配所有可能的情況

#^LIPE2$:匹配整個(gè)字符串只有LIPE2這個(gè)基因,^錨定開(kāi)始,$錨定結(jié)尾
#,LIPE2,:匹配LIPE2在中間,前后都有其他基因
#^LIPE2,:匹配LIPE2在開(kāi)始,后面有基因
#,LIPE2$:匹配LIPE2在結(jié)尾,前面有基因
#|是或,即滿(mǎn)足其中任何一個(gè)條件即可
grepl("^LIPE2$|,LIPE2,|^LIPE2,|,LIPE2$",s)
#[1] FALSE FALSE  TRUE  TRUE FALSE

方法二,利用\b,單詞邊界

#\b匹配一個(gè)單詞邊界,也就是指單詞和空格間的位置。
#例如,“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”。
grepl("\\bLIPE2\\b",s)
#[1] FALSE FALSE  TRUE  TRUE FALSE

方法三,利用strsplit和%in%

sapply(s,function(x){
  'LIPE2' %in% strsplit(x,',')[[1]]
})

返回的結(jié)果是

如果對(duì)strsplit還不熟悉的小伙伴,其實(shí)可以先輸出來(lái)看看結(jié)果

sapply(s,function(x){
  strsplit(x,',')[[1]]
})

返回的結(jié)果是分割之后的字符串向量

參考資料:

  1. 正則表達(dá)式
  2. https://www.rdocumentation.org/packages/base/versions/3.6.2/topics/strsplit
  3. https://www.rdocumentation.org/packages/base/versions/3.6.2/topics/grep
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容