俗話說,「獨學而無友,則孤陋而寡聞」。
為了方便大家交流學習,共同進步,我特地創建了微信交流群
長按二維碼加入「生信交流群」
或
後臺留言「生信交流群」入群
廢話不多說,我們來聊聊今天的正題。昨天有位群友在群裡提出了這樣一個問題
具體的字符串向量是這樣的,需要達到的目的就是,看字符串向量裡面的每一個元素是否包含"LIPE2"這個基因。這裡的字符串向量有四個元素。
實現的手段就是通過R的grepl函數
這個函數裡的pattern是匹配的模式,也就是我們經常聽到的正則表達式。如果對正則表達式還不了解的小夥伴,可以參考☞正則表達式☜。x就是要查看是否滿足pattern的字符串向量,如果匹配pattern就返回TRUE,不滿足就返回FASLE。
這位群友所提出的問題,tricky的地方在於LIPE2這個基因有時候存在於字符串的中間,有時候存在於開頭,有時候又存在於末尾,並且還需要考慮一些幹擾項比如LIPE23這個基因也能夠匹配LIPE2,似乎很難通過一個正則表達式來實現。後來這位群友自己解決了這個問題,方法就是通過或來實現。既然一個正則表達式無法滿足需要,那就多寫幾個正則表達式,把所有可能的情況都考慮進去。
這個問題引起了群裡關於正則表達式激烈的討論,
其實,在這個群友提出這個問題之前,我還不太確定,pattern裡面可以使用或(|),通過討論大家都有所收穫,至少群裡的其他小夥伴知道了正則表達式這個概念。以後遇到相似的問題,也知道怎麼解決了。
今天我又仔細的研究了一下,給出了三種實現的方法,供大家交流學習。我又加入了一個幹擾項,讓這個正則表達式更全面。
s <- c("ABCLIPE2", "LIPE-AS1,LIPE,CXCL17", "LIPE-AS1,LIPE2,LIPE,CXCL17", "LIPE2", "LIPE23")方法一,直接匹配所有可能的情況
grepl("^LIPE2$|,LIPE2,|^LIPE2,|,LIPE2$",s)
方法二,利用\b,單詞邊界
方法三,利用strsplit和%in%
sapply(s,function(x){ 'LIPE2' %in% strsplit(x,',')[[1]]})返回的結果是
如果對strsplit還不熟悉的小夥伴,其實可以先輸出來看看結果
sapply(s,function(x){ strsplit(x,',')[[1]]})返回的結果是分割之後的字符串向量
參考資料:
正則表達式
https://www.rdocumentation.org/packages/base/versions/3.6.2/topics/strsplit
https://www.rdocumentation.org/packages/base/versions/3.6.2/topics/grep
往期精彩:
你的贊同是我前進的動力