2016-11-08 6 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. Если я преодолю это (например, заменив AC на AB), то пятая запись дает мне «неспособность» вместо «Ab26604».

Я ищу: 1. Можно ли это сделать без цикла (возможно, используя одну из функций приложения) 2. Как объяснить сценарий с 3-м и 5-м случаями? [Я хотел, чтобы удалить «-'sign (я могу позаботиться об этом в следующем шаге, но было интересно, если это может быть сделано одновременно)]

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

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

Спасибо за помощь. Я очень ценю это. Пожалуйста, дайте мне знать, если вам нужны дополнительные разъяснения

+1

'GSUB ('(я) \\ Ь (АВ \\ S +) |?.', '\\ 1', х, Perl = TRUE)' – rawr

+0

@rawr ты должен отправить ответ и объяснить колдовство. В частности, '| .' в конце. –

ответ

1

Вы можете сделать что-то вроде следующего:

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

Который дает вам:

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

Если вы хотите заменить NA на " " вы можете do:

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

Что дает вам:

"AB22148" " "  "AB11025" "AB16228" "Ab26604" 
Смежные вопросы