Удалить отдельные буквы алфавита c строк - PullRequest
0 голосов
/ 12 января 2020

В столбце строковых данных как можно проверить в каждой строке, существует ли буква алфавита, и удалить ее.

Пример

I am a text r r o n n r and here

И вывести это

I am a text and here

Ответы [ 3 ]

3 голосов
/ 12 января 2020
gsub("\\s[A-Za-z](?= )", "", "I am a text r r o n n r and here", perl = TRUE)
# [1] "I am text and here"

Поскольку вы хотите сохранить один a, вы можете использовать любое из следующих значений для более специфичных c шаблонов:

### just three letters: r o n
gsub("\\s[orn](?= )", "", "I am a text r r o n n r and here", perl = TRUE)
# [1] "I am a text and here"

### any single-letter except "a" and "i"
gsub("\\s[B-HJ-Zb-hj-z](?= )", "", "I am a text r r o n n r and here", perl = TRUE)
# [1] "I am a text and here"

(Исключение составляет i в второй пример здесь не нужен строго, но приведен в качестве примера.)

Использование « упреждающего просмотра » ((?= ) используется, поскольку вы указали требование для пробел до и после, если вы используете шаблон "\\s[orn]\\s", то он пропустит много отдельных букв (из-за рекурсивных замен). Если вы немного ослабите это, то вы можете использовать границы слов, как в

gsub("\\s[B-HJ-Zb-hj-z]\\b", "", "I am a text r r o n n r and here")

(Хотя регулярные выражения в стиле perl могут технически привести к снижению производительности, я подозреваю, что это действительно имеет значение только в том случае, если вы много делаете и нуждаетесь в повышении производительности настолько, насколько можете. Не строго требуется, и ранняя оптимизация - это «root всего зла» - Дональд Кнут )

Примечание: В этом последнем паттерне я также исключаю строчные буквы i в дополнение к прописным буквам I; если вы уверены, что никогда не увидите действительный в противном случае i, тогда вы можете настроить свой шаблон так, чтобы использовать [B-HJ-Zb-z]. (Спасибо @ jay.sf за выделение этого предположения.)

2 голосов
/ 12 января 2020

Вы можете сделать это с помощью пакета stringr следующим образом:

library(stringr)
library(dplyr)

# Create dataframe with column
data <-
  data.frame(
    A = c("I am a text r r o n n r and here")
  )

# Replacing ron in column with nothing
data %>%
  mutate(A = str_replace_all(A, "\\b[ron] \\b", ""))

# A
# I am a text and here
1 голос
/ 12 января 2020

Условие не очень ясно

gsub('\\b[ron] ', '',  txt)
#[1] "I am a text and here"

Или с использованием более общего подхода

gsub("(?<=\\b\\K[a-z]) [a-z] ", "", txt, perl = TRUE)
#[1] "I am a text and here"

Или более просто

gsub('\\b[a-z] [a-z] ', '', txt)
#[1] "I am a text and here"

Или с str_remove_all

library(stringr)
str_remove_all(txt, "\\b[ron] ")
#[1] "I am a text and here"

данные

txt <- "I am a text r r o n n r and here"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...