2011-03-14 21 views
11

Üniversite ana dallarında bir veri listesini temizlemeyi içeren bir proje üzerinde çalışıyorum. Ben bir çok yanlış yazılmış buluyorum, bu yüzden yanlış yazılanları doğru yazım ile değiştirmek için gsub() işlevini kullanmak istiyordum. Mesela 'biolgy', Major adında bir majör listesinde yanlış yazıldığını varsayalım. R yazım hatalarını algılamak ve doğru yazımla değiştirmek için R'yi nasıl alabilirim? Ben gsub('biol', 'Biology', Major) denedim ama bu sadece 'biolgy' içindeki ilk dört harf yerine geçer. gsub('biolgy', 'Biology', Major)'u kullanırsam, bu durumda tek başına çalışır, ancak bu 'biyolojinin' diğer yanlış yazım biçimlerini tespit etmez.R, Başka bir dizeyle belirli bir desen içeren bir dizeyi nasıl değiştiririm?

Teşekkür ederiz!

cevap

13

Etmeli ya da bazı şık düzenli ifade tanımlamak veya base paketinden agrep kullanın. stringr paketi başka bir seçenektir, insanların kullandığını biliyorum, ama normal ifadelerin çok büyük bir hayranıyım, bu yüzden benim için hayır.

agrep("biol", "biology") 
[1] 1 
agrep("biolgy", "biology") 
[1] 1 

DÜZENLEME:

Ayrıca ignore.case = TRUE kullanmalıdır fakat "elle" Bazı muhasebe yapmak için hazır olun ...

+0

Cevabınız için teşekkürler, şimdi agrep ile oynadım. Basitçe bir tamsayı döndürdüğümü (tahmin ettiğim dizge sayısı değiştiğini tahmin ediyorum) buluyorum, ama aslında bu değişikliği mi yürütüyor? Örneğin, örneğin, hayvanların = c ("fare", "köpek", "kedi") olduğunu varsayalım. Eğer fare ile değiştirmek istedim, "peynir" deyin, o zaman agrep ("mou", "peynir", hayvanlar) kullanabilir miyim? Bunu yaptığımda bir tam sayı (0) döndürür. Teşekkür ederim!! – Alan

+0

'agrep' vektör indekslerini döndürür, böylece kolayca bir değer atayabilirsiniz:' hayvanlar [agrep ("mou", hayvanlar)] <- "peynir" ' – aL3xa

+0

Mükemmel Teşekkür ederim :) – Alan

2

Olası tüm yazım hatalarını içeren bir vektör oluşturabilir ve daha sonra gsub araması üzerinden bir döngü oluşturabilirsiniz. gibi bir şey: orada CRAN üzerindeki herhangi bulanık eşleştirme paketleri, ya eşleştirme 'soundex' kullanan bir şey varsa

biologySp = c("biolgy","biologee","bologee","bugs") 

for(sp in biologySp){ 
    Major = gsub(sp,"Biology",Major) 
} 

daha akıllıca bir şey yapmak istiyorsanız, yaklaşık on

.... wikipedia sayfasına bakın. string eşleştirmesi yararlı olabilir ve bazı temel terimler için R-help'i aramayı deneyin.

http://en.wikipedia.org/wiki/Approximate_string_matching

+0

Zaten 'base' paketinde bulanık eşleşme var:' agrep' işlevi bunu yapar. Cevabımı aşağıya bakın. – aL3xa

2

You

neyse, agrep hile yapmak gerekir İlk olarak, majörleri mevcut bir bölümün listesiyle eşleştirebilir, eşleşmeyen herhangi bir olasılık muhtemelen yanlış yazımlar olacaktır. Ardından agrep işlevini bunları bilinen majörlere karşı tekrar eşleştirmek için kullanın (agrep yaklaşık eşleştirmeyi gösterir, bu nedenle doğru değere benzerse o zaman bir eşleşme elde edersiniz).

+0

Ve bunun için remaning binbaşı için, bir şey yerine (remaMajor, agrep ("biyoloji", KalanMajor), "biyoloji") 'yapmalıdır. – hatmatrix

+0

(ancak neyi değiştireceğinize bakmak için "beforeMajor [agrep (" biyoloji ", remainingMajor)] ile daha önce kontrol edin) – hatmatrix

0

VWR paket dize eşleştirme için yöntemleri vardır:

http://ftp.heanet.ie/mirrors/cran.r-project.org/web/packages/vwr/index.html

yüzden en iyi bahis mümkün konu dizeleri asgari Levenshtein mesafe ile dize kullanmak olabilir:

> levenshtein.distance("physcs",c("biology","physics","geography")) 
    biology physics geography 
     7   1   9 

Aynı minima alırsanız, bir jeton çevirin:

> levenshtein.distance("biolsics",c("biology","physics","geography")) 
    biology physics geography 
     4   4   8 
0

Örnek 1a) Perl/Linux normal ifade: 's/oldstring/newstring/'

örnek 1b) 1a R eşdeğeri: srcstring=sub(oldstring, newstring, srcstring)

örnek 2a) Perl/Linux normal ifade: 's/oldstring//'

örnek 2b) 2a R eşdeğeri: srcstring=sub(oldstring, "", srcstring)

İlgili konular