2016-11-08 34 views
0

我試圖提取某個字母后面的單詞。例如,在這個例子中,我試圖提取下面寫着「AB」從R中的句子中提取單詞

x = c("So much fun - AB22148",      
"AC33648 does whatever",       
"I know -AB11025 Failed",     
"Nothing stalled - AB16228",   
"Unable to do fdS2083D - Ab26604") 

Num = character(0) 
for (i in 1:length(x)) { 
    y = unlist(strsplit(x[i]," ")) 
    Num[i] = grep("AB",y, perl = T, value = T, ignore.case = T) 
    } 

有幾個問題(因爲你很可能知道):1.如果「AB」不存在,那麼我得到一個錯誤因爲Num不能取零長度。 2.如果我克服了這個問題(例如通過用AB代替AC),那麼第5個條目給我'不能'而不是'Ab26604'。

我在尋找的是:1.可以在沒有循環的情況下完成(可能使用其中一個應用函數)2.如何解釋第三和第五種情況下的情況? [我會想刪除「-'sign(在下一步我可以照顧這一點,但不知道是否可以同時進行)

Num (current output) 
    [1] "AB22148" " " "-AB11025" "AB16228" "Unable" 

    Num (required output) 
[1] "AB22148" " " "AB11025" "AB16228" "Ab26604" 

感謝所有幫助。對此,我真的非常感激。請讓我知道如果你需要進一步澄清

+1

'GSUB( '(我)\\ B(AB \\ S +)|?', '\\ 1',X,PERL = TRUE)' – rawr

+0

@rawr你必須張貼的答案和解釋巫術。特別是最後的'| .'。 –

回答

1

你可以做類似如下:

require(stringr) 
str_extract(x, regex("AB[:alnum:]{5}", ignore_case = TRUE)) 

它給你:

"AB22148" NA  "AB11025" "AB16228" "Ab26604" 

如果你想更換NA通過" "可以做:

str_replace_na(tmp, " ") # assuming tmp is the result from above 

它給你:

"AB22148" " "  "AB11025" "AB16228" "Ab26604"