2016-02-05 9 views
0

Мне хотелось бы совместить слово после - в моем тексте, если это совпадающее слово - это конец другого слова, тогда я хотел бы сделать раздвоение между словом и совпадающим словом.Как совместить слово после определенного персонажа без знания слова в R?

Пример текста:

JOHN LION - XYZ RAN RUN TREEABC GRASS - ABC LIMB RAN RUN LION -XYZ JOG SUN 
SKY - ABC LION JOHN PONDABC RUN - PDF STONE 

, что я хотел бы, чтобы текст выглядеть следующим образом:

JOHN LION - XYZ RAN RUN TREE ABC GRASS - ABC LIMB RAN RUN LION -XYZ JOG SUN 
SKY - ABC LION JOHN POND ABC RUN - PDF STONE 

Я не не хочу делать grepl и gsub на ABC, потому что слово после того, как тире всегда меняется и будет появляться несколько раз. Также слово, которое находится перед совпадающим словом, всегда будет отличаться и не всегда будет TREE. Независимо от того, что это слово перед совпадающим словом, я всегда хочу сделать раскол.

Если я следующий str_extract:

str_extract(df, "(?<=-\\s)\\w+") 

Тогда я сопрягать XYZ не ABC.

Я хочу только совместить слово после -, если оно также находится в конце другого слова, но опять же я не знаю, что это за другое слово.

Я застрял как что делать. Пожалуйста, дайте мне знать, нужна ли какая-либо дополнительная информация. Любая помощь будет оценена.

+0

Я вижу все виды проблем с этим, например, что произойдет, если после тире соответствует слово появляется более одного раза? Существуют ли какие-либо случаи, когда вы не хотели бы разделить согласованное слово? –

+0

@ Спасибо за ваш комментарий Я отредактировал свой вопрос. Но совпадающее слово после тире будет появляться много раз, и я всегда хочу сделать раскол, независимо от того, что будет перед словом. – Dre

ответ

1

Вот один мягкий хакерский путь. Назовём Расширенные данные s:

s <- 'JOHN LION - XYZ RAN RUN TREEABC GRASS - ABC LIMB RAN RUN LION -XYZ JOG SUN SKY - ABC LION JOHN PONDABC RUN - PDF STONE' 

С stringr, давайте использовать существующий регулярное выражение для извлечения моделей, которые будут совпавшие:

library(stringr) 
pat <- str_extract_all(s, "(?<=-\\s)\\w+") 

Используйте эти шаблоны, чтобы найти все слова с не-пробельных символов до шаблон и пробел после (т.е. слов, которые нуждаются пробела):

words <- str_extract_all(s, paste0('[A-Za-z0-9]+', pat[[1]], '\\s')) 

Вставка пространство в этих словах, заменив узоры остроумия h - пробел, а затем шаблон. Чтобы сделать это все сразу, вам нужно использовать lapply, так как str_extract_all создает список.

words2 <- lapply(1:length(words), function(x){   # a little hacky 
    str_replace_all(words[[x]], pat[[1]][x], paste0(' ', pat[[1]][x])) 
}) 

Чтобы заменить все совпавшие слова с фиксированными из них, нам нужно запустить str_replace_all с каждым словом и замены, так что необходимо либо обновить s в то время как мы делаем цикл с sapply:

sapply(1:length(words), function(x){        # hacky 
    s <<- str_replace_all(s, unlist(words)[x], unlist(words2)[x]) # hackier 
}) 

который будет производить некоторые бесполезный вывод, но обновлять s, или использовать for петлю, которая несколько чище:

for(x in 1:length(words)){ 
    s <- str_replace_all(s, unlist(words)[x], unlist(words2)[x]) 
} 

В любом случае, мы получаем

> s 
[1] "JOHN LION - XYZ RAN RUN TREE ABC GRASS - ABC LIMB RAN RUN LION -XYZ JOG SUN SKY - ABC LION JOHN POND ABC RUN - PDF STONE" 
+0

Это сработало отлично. Я решил пойти с циклом for. Спасибо. – Dre