2014-01-30 110 views
0

只需要grepl的一些幫助,它就在我的腦海裏!R grepl變量比較

我有兩個變量:

str1<-"AAV.L" 
str2<-"AAV2.L" 

而我想要做的是檢查是否str2str1擴展(這是在這種情況下)。基本上這裏str2有它的名字一個額外"2" ..

理想的解決辦法是這樣的:

grepl(str1,paste0(str2,...)) 

但我不知道要佔str1.。變量的長度不一樣,所以我不能檢查str1的前3個字符是否存在於str2中。

任何人有任何想法?

謝謝!

編輯 - 澄清..

基本上是由我的意思是,如果一個變量包含完全相同的字母,更多的「延伸」,以相同的順序。所以上面的例子AAV.LAAV2.L會匹配,因爲它包含AAV..L。但它不一定是這樣,它應該匹配REWRREWRLE以及含義REWR..

所以c("AAV.LE", "BAAV.L","AABV.L","AAV..L","ABCAV.L"),沒有人會匹配。如果我把一個規則來進行比賽拖入純英文這將是:

是否str2開始與str1或是否與str1任何子集str2啓動,並與其他子集結束?

我已經看了一下agrep,但它匹配得太不準確。例如AAV.LAAV2.L匹配哪個好,但是ADDAPUAD也是這樣做的,這是不正確的!我知道我可以指定max.distance,但一些字符串可能是ADDADDDDDDDDD,這將使設置此值不合情理。

讓我知道這是否有幫助。

+3

你能更準確地反映這個問題呢?你究竟如何確定一個字符串是否是「另一個字符串的擴展」? –

+0

另外,你是否必須使用'grepl'?根據你對我上次評論的回答,我認爲不使用正則表達式可能會更容易。 –

+1

-1並投票結束:你沒有提供足夠的例子或解釋來唯一確定你想要的。 'c(「AAV.LE」,「BAAV.L」,「AABV.L」,「AAV..L」,「ABCAV.L」)中的內容應該匹配嗎?你可能想看看'agrep'。 –

回答

0

在放入grepl之前,您可以刪除點擴展名。

str1 <- sub("\\.[[:alnum:]]+$", "", str1); 
## AAV 

str2 <- sub("\\.[[:alnum:]]+$", "", str2); 
## AAV2 

注意:這是一種刪除文件擴展名的方法。它不會消除任何其他點字符的出現。它的工作原理是替換一個句點的出現,然後是字母數字字符,然後從字符串的末尾開始搜索。它用一個空的(「」)字符串替換它。

str3 <- "A.A.V.L" 
str3 <- sub("\\.[[:alnum:]]+$", "", str3); 
## A.A.V 

然後,使用grepl

grepl(str1, str2) 
## TRUE 
+0

嗨@DashAnimal,謝謝你的回答。不知道這對於大量比較和大字符串是否真的很實用。編輯的問題,也許它會幫助培育一個新的答案? –