Удалить все специальные символы из строки в R?

119

Как удалить все специальные символы из строки в R и заменить их пробелами?

Некоторые специальные символы, которые следует удалить: ~!@#$%^&*(){}_+:"<>?,./;'[]-=

Я пробовал regexс [:punct:]шаблоном, но он удаляет только знаки препинания.

Вопрос 2: А как убрать символы из иностранных языков типа â í ü Â á ą ę ś ć:?

Ответ: Используйте [^[:alnum:]]для удаления ~!@#$%^&*(){}_+:"<>?,./;'[]-=и используйте [^a-zA-Z0-9]для удаления также â í ü Â á ą ę ś ćв функциях regexили regexpr.

Qbik
источник
4
Какое определение для «специального символа»?
kohske
Мое собственное определение - это каждый символ, которого нет в Юникоде ;-). Но я думаю, многие другие люди не согласятся.
Joey
Может быть, взгляните на subили gsubфункции.
Paul Hiemstra
5
regex [: punct:] сделает половину работы, а может и все
Qbik

Ответы:

197

Вам нужно использовать регулярные выражения для выявления нежелательных символов. Для наиболее легко читаемого кода вы хотите получить код str_replace_allиз stringrпакета, хотя gsubбазовый R работает так же хорошо.

Точное регулярное выражение зависит от того, что вы пытаетесь сделать. Вы можете просто удалить те конкретные символы, которые вы указали в вопросе, но гораздо проще удалить все символы пунктуации.

x <- "a1~!@#$%^&*(){}_+:\"<>?,./;'[]-=" #or whatever
str_replace_all(x, "[[:punct:]]", " ")

(Базовый R эквивалент gsub("[[:punct:]]", " ", x).)

Альтернативой является замена всех не буквенно-цифровых символов.

str_replace_all(x, "[^[:alnum:]]", " ")

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

Ричи Коттон
источник
11
хорошие ответы +1 Вы можете хотеть заменить " "с ""иначе у вас есть пустое белое пространство в строке.
Тайлер Ринкер
8
@TylerRinker: Верно, хотя QBik специально просил пробелы.
Ричи Коттон,
8
Как удалить remowe этих сумасшедший символов: â í ü Â á?
Qbik
1
Вам нужно прочитать о регулярных выражениях. Начните со ссылки в моем ответе, а затем прочтите ?regexи ?regexpr.
Ричи Коттон,
1
Попробуйте заменить [^[:alnum:]]на [^a-zA-Z0-9]или, возможно \\W.
Ричи Коттон,
28

Вместо использования регулярного выражения для удаления этих «сумасшедших» символов просто преобразуйте их в ASCII, который удалит акценты, но сохранит буквы.

astr <- "Ábcdêãçoàúü"
iconv(astr, from = 'UTF-8', to = 'ASCII//TRANSLIT')

что приводит к

[1] "Abcdeacoauu"
Фелипе Альваренга
источник
Пришлось добавить iconv(astr, from="UFT-8", to="ASCII//TRANSLIT"), а то с французскими иероглифами вроде çполучается немного смешно.
Duccio A
8

Преобразуйте специальные символы в апостроф,

Data  <- gsub("[^0-9A-Za-z///' ]","'" , Data ,ignore.case = TRUE)

Код ниже, чтобы удалить лишний апостроф

Data <- gsub("''","" , Data ,ignore.case = TRUE)

Используйте gsub(..)функцию для замены специального символа апострофом

UMESH NITNAWARE
источник