Как удалить повторяющиеся символы в строке с помощью R?

Я хотел бы реализовать функцию с R, которая удаляет повторяющиеся символы в строке. Например, моя функция называется removeRS, поэтому она должна работать следующим образом:

  removeRS('Buenaaaaaaaaa Suerrrrte')
  Buena Suerte
  removeRS('Hoy estoy tristeeeeeee')
  Hoy estoy triste

Моя функция будет использоваться со строками, написанными на испанском языке, поэтому не так часто (или, по крайней мере, правильно) находить слова, содержащие более трех последовательных гласных. Не беспокойтесь о возможных чувствах позади них. Тем не менее, есть слова, которые могут иметь два последовательных согласных (особенно ll и rr), но мы могли бы пропустить это из нашей функции.

Итак, чтобы подвести итог, эта функция должна заменить буквы, которые появляются по крайней мере три раза подряд только с этой буквой. В одном из приведенных выше примеров aaaaaaaaa заменяется на a.

Не могли бы вы дать мне какие-либо подсказки для выполнения этой задачи с помощью R?

Ответ 1

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

gsub('([[:alpha:]])\\1+', '\\1', 'Buenaaaaaaaaa Suerrrrte')
# [1] "Buena Suerte"

() сначала записывает письмо, \\1 относится к этой букве, + означает его одно или более совпадений; поместите все эти части вместе, мы можем сопоставить букву два или более раз.

Чтобы включить другие символы помимо буквенно-цифровых символов, замените [[:alpha:]] на регулярное выражение, соответствующее тому, что вы хотите включить.

Ответ 2

Я думаю, вы должны обратить внимание на двусмысленности в описании проблемы. Это первый удар, но он явно не работает с "Удачей" по вашему желанию:

removeRS <- function(str) paste(rle(strsplit(str, "")[[1]])$values, collapse="")
removeRS('Buenaaaaaaaaa Suerrrrte')
#[1] "Buena Suerte"

Ответ 3

Так как вы хотите заменить буквы, появляющиеся AT LEAST 3 раза, вот мое решение:

gsub("([[:alpha:]])\\1{2,}", "\\1", "Buennaaaa Suerrrtee")
#[1] "Buenna Suertee"

Как вы можете видеть, 4 "a" были сведены только к 1 a, 3 r были уменьшены до 1 r, но 2 n и 2 e не были изменены. Как было предложено выше, вы можете заменить [[:alpha:]] любой комбинацией [a-zA-KM-Z] или аналогичной, и даже использовать оператор "или" | внутри скобок [y|Q], если вы хотите, чтобы ваш код влиял только на повторения y и Вопрос.

gsub("([a|e])\\1{2,}", "\\1", "Buennaaaa Suerrrtee")
# [1] "Buenna Suerrrtee"
# triple r are not affected and there are no triple e.

Ответ 4

Я хотел бы сделать что-то очень похожее, но не могу понять это.

Input = c("0000000329 N HALE ST", "0000000703 SANCTUARY LN", "0000002255 GLENEAGLES DR", "0000000234 000000W045 MARKUS GLEN DR")

Я хотел бы иметь возможность удалить в любое время, когда у меня есть 3+ подряд 0. (Обратите внимание, что это может произойти в начале строки, а также внутри строки). я бы хотел быть

Output = c("329 N HALE ST", "703 SANCTUARY LN", "2255 GLENEAGLES DR", "234 W045 MARKUS GLEN DR")

Огромное спасибо.