Удалить несколько шаблонов из текстового вектора r

Я хочу удалить несколько шаблонов из нескольких векторов символов. В настоящее время я собираюсь:

a.vector <- gsub("@\\w+", "", a.vector)
a.vector <- gsub("http\\w+", "", a.vector)
a.vector <- gsub("[[:punct:]], "", a.vector)

и т. д.

Это больно. Я смотрел на этот вопрос и ответ: R: gsub, pattern = vector и replace = vector, но это не решает проблему.

Ни mapply ни mgsub работают. Я сделал эти векторы

remove <- c("@\\w+", "http\\w+", "[[:punct:]]")
substitute <- c("")

ни mapply(gsub, remove, substitute, a.vector) ни mgsub(remove, substitute, a.vector) worked.

a.vector выглядит так:

[4951] "@karakamen: Suicide amongst successful men is becoming rampant. Kudos for staing the conversation. #mental"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
[4952] "@stiphan: you are phenomenal.. #mental #Writing. httptxjwufmfg"   

Я хочу:

[4951] "Suicide amongst successful men is becoming rampant Kudos for staing the conversation #mental"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
[4952] "you are phenomenal #mental #Writing"   `

2 ответа

Я знаю, что этот ответ опоздал на сцену, но он проистекает из моей неприязни к необходимости вручную перечислять шаблоны удаления внутри grep функции (см. другие решения здесь). Моя идея состоит в том, чтобы заранее установить шаблоны, сохранить их как символьный вектор, а затем вставить их (то есть, когда "необходимо"), используя regex Seperator "|":

library(stringr)

remove <- c("@\\w+", "http\\w+", "[[:punct:]]")

a.vector <- str_remove_all(a.vector, paste(remove, collapse = "|"))

Да, это действительно делает то же самое, что и некоторые другие ответы здесь, но я думаю, что мое решение позволяет вам сохранить оригинальный "вектор удаления символов" remove,

Попробуйте объединить ваши подшаблоны, используя |, Например

>s<-"@karakamen: Suicide amongst successful men is becoming rampant. Kudos for staing the conversation. #mental"
> gsub("@\\w+|http\\w+|[[:punct:]]", "", s)
[1] " Suicide amongst successful men is becoming rampant Kudos for staing the conversation #mental"

Но это может стать проблематичным, если у вас большое количество шаблонов или если результат применения одного шаблона создает совпадения с другими.

Рассмотрите возможность создания своего remove вектор, как вы предложили, затем применяя его в цикле

> s1 <- s
> remove<-c("@\\w+","http\\w+","[[:punct:]]")
> for (p in remove) s1 <- gsub(p, "", s1)
> s1
[1] " Suicide amongst successful men is becoming rampant Kudos for staing the conversation #mental"

Этот подход необходимо будет расширить, чтобы применить его ко всей таблице или вектору, конечно. Но если вы поместите его в функцию, которая возвращает окончательную строку, вы сможете передать ее одному из apply варианты

В случае, если несколько шаблонов, которые вы ищете, являются фиксированными и не меняются от случая к случаю, вы можете рассмотреть возможность создания объединенного регулярного выражения, которое объединяет все шаблоны в один шаблон регулярного выражения uber.

Для приведенного вами примера вы можете попробовать:

removePat <- "(@\\w+)|(http\\w+)|([[:punct:]])"

a.vector <- gsub(removePat, "", a.vector)

У меня был вектор с утверждением "мой окончательный результат", и я хотел сохранить слово "окончательный" и убрать остальное. Это то, что сработало для меня на основе предложения Мариан:

str_remove_all("мой окончательный счет", "мой | счет")

примечание: "моя окончательная оценка" - это всего лишь пример. Я имел дело с вектором.

Другие вопросы по тегам