2011-03-14 36 views
11

我正在研究一個涉及清理大學專業數據清單的項目。我發現很多拼寫錯誤,所以我正在使用函數gsub()來替換拼寫錯誤的拼寫錯誤。例如,說'biolgy'拼寫錯誤的專業稱爲主要名單。我如何讓R檢測拼寫錯誤並將其替換爲正確的拼寫?我試過gsub('biol', 'Biology', Major),但是它只替換了'biolgy'中的前四個字母。如果我做gsub('biolgy', 'Biology', Major),它僅適用於這種情況,但這並不能檢測到其他形式的「生物學」拼寫錯誤。在R中,如何用另一個字符串替換包含特定模式的字符串?

謝謝!

回答

13

您應該定義一些漂亮的正則表達式,或者使用agrepbase包。 stringr包是另一種選擇,我知道人們使用它,但我是一個非常巨大的正則表達式的粉絲,所以對我來說這是一個禁忌。

反正agrep應該做的伎倆:

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

編輯:

您還應該使用ignore.case = TRUE,但要準備 「手動」 做一些簿記...

+0

感謝您的回覆,我剛剛與agrep一起玩過。我發現它只是返回一個整數(我猜對應於更改的字符串的數量),但它實際上是否執行更改?例如,假設我有動物= c(「老鼠」,「狗」,「貓」)。如果我想用「奶酪」代替鼠標,那麼我可以使用agrep(「mou」,「奶酪」,動物)嗎?當我這樣做時它返回一個整數(0)。謝謝!! – Alan 2011-03-14 18:57:36

+0

'agrep'返回矢量指數,所以你可以很容易地使用下標來指定一個值:'動物[agrep(「mou」,動物)]​​ < - 「奶酪」' – aL3xa 2011-03-14 19:10:04

+0

非常感謝你:) – Alan 2011-03-14 19:19:07

2

您可以設置所有可能拼寫錯誤的矢量,然後通過gsub調用進行循環。喜歡的東西:

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

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

如果你想要做的事聰明,看看是否有關於CRAN任何模糊匹配的軟件包,或使用「同音」匹配的東西....

維基百科頁面上約。字符串匹配可能會很有用,並嘗試在某些關鍵術語中搜索R-help。

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

+0

'base'包中已經有模糊匹配:'agrep'函數可以做到這一點。請參閱下面的答案。 – aL3xa 2011-03-14 18:49:27

2

你可以首先匹配專業與可用專業名單,任何不匹配,然後可能misspellings。然後使用agrep函數將這些與已知專業相匹配(agrep進行近似匹配,所以如果它與正確的值相似,那麼您將得到一個匹配)。

+0

對於重整專業的學生來說,像replace(剩餘的主要,agrep(「生物學」,剩下的主要),「生物學」)這樣的東西應該這樣做。 – hatmatrix 2011-03-14 18:50:27

+0

(但請查閱'remainingMajor [agrep(「biology」,remainingMajor)]'以查看您將要替換的內容) – hatmatrix 2011-03-14 18:51:35

0

的VWR包有一個用於字符串匹配的方法:

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

所以最好的辦法可能是使用字符串以從可能的主題串最小Levenshtein距離:

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

如果您獲得相同的最小值,然後翻轉一枚硬幣:

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

實施例1a)的perl/Linux的正則表達式:'s/oldstring/newstring/'

實施例1b)R等效1a的:srcstring=sub(oldstring, newstring, srcstring)

實施例2a)的perl/Linux的正則表達式:'s/oldstring//'

實施例2b)R等效2a的:srcstring=sub(oldstring, "", srcstring)

相關問題