R'deki bir dizedeki tüm özel karakterler kaldırılsın mı?


118

R'deki dizeden tüm özel karakterler nasıl kaldırılır ve boşluklarla değiştirilir?

Kaldırılacak bazı özel karakterler şunlardır: ~!@#$%^&*(){}_+:"<>?,./;'[]-=

Denedim regexile [:punct:]desen ancak yalnızca noktalama işaretlerini kaldırır.

Soru 2: Ve nasıl gibi yabancı dillerden karakterleri kaldırmak için â í ü Â á ą ę ś ć?

Cevap: [^[:alnum:]]Kaldırmak için kullanın ~!@#$%^&*(){}_+:"<>?,./;'[]-=ve içindeki veya işlevlerini [^a-zA-Z0-9]de kaldırmak için kullanın .â í ü Â á ą ę ś ćregexregexpr


4
"Özel karakter" in tanımı nedir?
kohske

Benim tanımım, Unicode'da olmayan her karakter ;-). Ama sanırım pek çok insan aynı fikirde değil.
Joey

Belki bir göz atın subveya gsubişlevler.
Paul Hiemstra

5
regex [: punct:] işin yarısını yapacak ya da
belki

Yanıtlar:


197

İstenmeyen karakterleri tanımlamak için normal ifadeler kullanmanız gerekir . En kolay okunabilir kod için istediğiniz str_replace_alldan stringrolsa paketinden gsubtabanından R da iyi çalışır.

Tam normal ifade, ne yapmaya çalıştığınıza bağlıdır. Soruda verdiğiniz belirli karakterleri kaldırabilirsiniz, ancak tüm noktalama karakterlerini kaldırmak çok daha kolaydır.

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

(Temel R eşdeğeri gsub("[[:punct:]]", " ", x).)

Bir alternatif, tüm alfasayısal olmayan karakterleri değiştirmektir.

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

Bir harfi, sayıyı veya noktalama işaretini neyin oluşturduğunun tanımının bulunduğunuz yere bağlı olarak biraz değiştiğini unutmayın, bu nedenle tam olarak istediğinizi elde etmek için biraz denemeniz gerekebilir.


11
güzel cevaplar +1 ile değiştirmek isteyebilirsiniz " ", ""aksi takdirde dizede boş beyaz alanınız olur.
Tyler Rinker

8
@TylerRinker: Doğru, ancak QBik özellikle boşluklar istedi.
Richie Cotton

8
Nasıl bu çılgın karakterleri remowe silmek: â í ü Â á?
Qbik

1
Normal ifadeleri okumalısınız. Cevabımdaki bağlantıyla başlayın ve ardından ?regexve okuyun ?regexpr.
Richie Cotton

1
Veya muhtemelen [^[:alnum:]]ile değiştirmeyi deneyin . [^a-zA-Z0-9]\\W
Richie Cotton

28

Bu "çılgın" karakterleri kaldırmak için normal ifadeyi kullanmak yerine, onları aksanları kaldıracak ancak harfleri koruyacak olan ASCII'ye dönüştürün.

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

hangi sonuçlanır

[1] "Abcdeacoauu"

Eklemek zorunda kaldım iconv(astr, from="UFT-8", to="ASCII//TRANSLIT"), aksi takdirde Fransız karakterleri çbiraz komik oluyor.
Duccio A

8

Özel karakterleri kesme işaretine dönüştürün,

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

Fazladan '' 'kesme işaretini kaldırmak için aşağıya kodlayın

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

gsub(..)Özel karakteri kesme işaretiyle değiştirmek için işlevi kullanın

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.