2015-10-22 82 views
2

我有一個大型的數據集,有一百萬個觀察值,用一個已定義的觀察類型鍵入。在數據集中,有大約900,000個觀測類型異常的觀測,其中50個可接受的觀測類型有〜850個(不正確)的變化。r stringdist或levenshtein.distance替換字符串

keys <- c("DAY", "EVENING","SUNSET", "DUSK","NIGHT", "MIDNIGHT", "TWILIGHT", "DAWN","SUNRISE", "MORNING") 

entries <- c("Day", "day", "SUNSET/DUSK", "DAYS", "dayy", "EVEN", "Evening", "early dusk", "late day", "nite", "red dawn", "Evening Sunset", "mid-night", "midnight", "midnite","DAY", "EVENING","SUNSET", "DUSK","NIGHT", "MIDNIGHT", "TWILIGHT", "DAWN","SUNRISE", "MORNING") 

使用GSUB類似於挖地下室用一隻手鏟,並以我個人的情況下,一個破碎處理鏟因爲我很新的與R和複雜的正則表達式。簡單的回退(對我來說)是爲每個接受的觀察類型寫一個gsub語句,但這似乎不必要的繁瑣,因爲它需要50條語句。

我想用levenshtein.distancestringdist用最短距離字符串替換違規條目。運行z <- for (i in length(y)) { z[i] = levenshtein.distance(y[i], x)}不起作用,因爲它試圖將(長度(x))結果傳遞給每個y [i]。

如何以最小距離返回結果?我已經看到function(x) x[2]返回一系列的第二個結果,但如何獲得最低?

+0

你可能想看看)adist的'文檔('。 – RHertel

+0

將「SUNSET」和「DUSK」與「SUNSET/DUSK」進行比較時,您需要指定您認爲正確的匹配, –

+0

「SUNSET/DUSK」應通過距離方法評估爲「SUNSET」。數據集的性質使我無法確定「DUSK」或「SUNSET」是否更合適。 , –

回答

2

你可以嘗試:

library(stringdist) 
m <- stringdistmatrix(entries, keys, method = "lv") 
a <- keys[apply(m, 1, which.min)] 

如果你想用不同的算法進行實驗,看看?'stringdist-metrics'


或按在評論中提到的@RHertel

b <- keys[apply(adist(entries, keys), 1, which.min)] 

adist()文檔:

計算字符向量之間的近似字符串距離。距離是一個廣義的Levenshtein(編輯)距離,給出了將一個字符串轉換爲另一個字符串所需的插入,刪除和 替換所需的最小可能加權數。

,這兩種方法產生相同的結果:

> identical(a, b) 
#[1] TRUE 
+1

我大聲歡呼,嚇壞了狗!非常感謝你們兩位! adist正是我所期待的!巨大的微笑。謝謝。 –