Удалить несколько шаблонов из текстового вектора 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("мой окончательный счет", "мой | счет")
примечание: "моя окончательная оценка" - это всего лишь пример. Я имел дело с вектором.