Видалити всі спеціальні символи з рядка в R?


117

Як видалити всі спеціальні символи з рядка в R та замінити їх пробілами?

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

Я намагався regexз [:punct:]малюнком, але він видаляє лише розділові знаки.

Питання 2: А як видалити символи з іноземних мов на кшталт â í ü Â á ą ę ś ć:?

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


4
Що таке визначення "особливий характер"?
kohske

Моє власне визначення - це кожен символ, який не знаходиться в Unicode ;-). Але я думаю, що багато інших людей не погоджуються.
Джої

Можливо, погляньте на subабо gsubфункції.
Пол Хіемстра

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
Як видалити видалити цих божевільних персонажів â í ü Â á:?
Qbik

1
Потрібно читати на регулярних виразах. Почніть зі посилання у моїй відповіді, а потім прочитайте ?regexі ?regexpr.
Річі Коттон

1
Спробуйте замінити [^[:alnum:]]з [^a-zA-Z0-9]або , можливо \\W.
Річі Коттон

27

Замість того, щоб використовувати регулярні вирази для видалення цих "божевільних" символів, просто конвертуйте їх у 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(..)функцію для заміни спеціального символу апострофом

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.