Xóa tất cả các ký tự đặc biệt khỏi một chuỗi trong R?


116

Làm cách nào để xóa tất cả các ký tự đặc biệt khỏi chuỗi trong R và thay thế chúng bằng dấu cách?

Một số ký tự đặc biệt cần xóa là: ~!@#$%^&*(){}_+:"<>?,./;'[]-=

Tôi đã thử regexvới [:punct:]mẫu nhưng nó chỉ loại bỏ các dấu chấm câu.

Câu hỏi 2: Và cách xóa các ký tự trong tiếng nước ngoài như : â í ü Â á ą ę ś ć?

Trả lời: Sử dụng [^[:alnum:]]để loại bỏ ~!@#$%^&*(){}_+:"<>?,./;'[]-=và sử dụng [^a-zA-Z0-9]để loại bỏ cũng â í ü Â á ą ę ś ćtrong regexhoặc các regexprchức năng.


4
Định nghĩa của "special character" là gì?
kohske

Định nghĩa của riêng tôi sẽ là mọi ký tự không có trong Unicode ;-). Nhưng tôi đoán nhiều người khác sẽ không đồng ý.
Joey

Có thể xem qua subhoặc các gsubchức năng.
Paul Hiemstra

5
regex [: punct:] sẽ làm cho một nửa của công việc hoặc Mayby tất cả
Qbik

Câu trả lời:


196

Bạn cần sử dụng biểu thức chính quy để xác định các ký tự không mong muốn. Để có mã dễ đọc nhất, bạn muốn mã str_replace_alltừ stringrgói, mặc dù gsubtừ cơ sở R cũng hoạt động tốt.

Biểu thức chính quy chính xác phụ thuộc vào những gì bạn đang cố gắng thực hiện. Bạn chỉ có thể xóa những ký tự cụ thể mà bạn đã đưa ra trong câu hỏi, nhưng xóa tất cả các ký tự dấu câu sẽ dễ dàng hơn nhiều.

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

(R tương đương với cơ sở là gsub("[[:punct:]]", " ", x).)

Một giải pháp thay thế là hoán đổi tất cả các ký tự không phải chữ và số.

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

Lưu ý rằng định nghĩa về những gì cấu thành một chữ cái hoặc một số hoặc một dấu chấm câu hơi khác nhau tùy thuộc vào ngôn ngữ của bạn, vì vậy bạn có thể cần thử nghiệm một chút để có được chính xác những gì bạn muốn.


11
câu trả lời hay +1 Bạn có thể muốn thay thế " "bằng ""nếu không, bạn có khoảng trắng trống trong chuỗi.
Tyler Rinker

8
@TylerRinker: Đúng, mặc dù QBik đã đặc biệt yêu cầu khoảng trống.
Richie Cotton

8
Làm thế nào để xóa những ký tự điên rồ còn lại : â í ü Â á?
Qbik

1
Bạn cần phải đọc các biểu thức chính quy. Bắt đầu với liên kết trong câu trả lời của tôi, sau đó đọc ?regex?regexpr.
Richie Cotton

1
Hãy thử thay thế [^[:alnum:]]bằng [^a-zA-Z0-9]hoặc có thể \\W.
Richie Cotton

27

Thay vì sử dụng regex để loại bỏ những ký tự "điên rồ" đó, chỉ cần chuyển đổi chúng thành ASCII, sẽ loại bỏ dấu, nhưng sẽ giữ nguyên các chữ cái.

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

kết quả là

[1] "Abcdeacoauu"

Tôi đã phải thêm vào iconv(astr, from="UFT-8", to="ASCII//TRANSLIT"), nếu không thì với các ký tự tiếng Pháp như thế çsẽ hơi buồn cười.
Duccio A

8

Chuyển các ký tự đặc biệt thành dấu nháy đơn,

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

Dưới đây mã nó để loại bỏ dấu nháy đơn thừa '' '

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

Sử dụng gsub(..)hàm để thay thế ký tự đặc biệt bằng dấu nháy đơn

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.