2016-05-11 95 views
1

我正在處理大數據,我想用grep替換列值。在R中用grep替換列值

下面是一個簡單的例子:

data=data.frame(state=c("AlAbama","Alaaska","Arizoona"), 
        gender=c("male","female","female")) 
datalist=data.frame(state=c("Alabama","Alaska","Arizona")) 

在所謂的「數據」的數據,我已經寫在一個錯誤的方式各州的名字,我想通過在數據列表寫名字來替換它們。 所以我想用「grep」中的「datalist」中的列值替換「data」中的列值。

我已經試過這樣:

data[grep(data[,"state"],datalist[,"state"])] 

這:

for (u in datalist$state){ 
data[grep(u,datalist$state)] 
} 

但它不工作。

你有什麼想法如何解決這個問題?

此致, 家人在一起

+0

'stringdist'包是你唯一的希望! https://cran.r-project.org/web/packages/stringdist/stringdist.pdf –

+0

謝謝!你能舉個例子嗎? – Mily

回答

0

快速嘗試作爲答案。

library(stringdist) 

data1 <- data.frame(
    state = c("AlAbama", "Alaaska", "Arizoona", "NY"), 
    gender = c("male", "female", "female", "unkn") 
) 
datalist <- data.frame(state = c("Arizona", "Alabama", "Alaska")) 

dist_m <- data.frame(stringdistmatrix(data1$state, datalist$state)) 

dist_m$minID <- apply(dist_m, 1, which.min) 

data1$state2 <- datalist$state[dist_m$minID] 

而結果:

 state gender state2 
1 AlAbama male Alabama 
2 Alaaska female Alaska 
3 Arizoona female Arizona 
4  NY unkn Alaska 

當然,你將需要小心一點,但作爲一個特設的解決方案應該是罰款。

您還應該閱讀stringdist函數的參數methodweight

+0

謝謝:)有一個愉快的一天。 – Mily

+0

你也是!讓我知道它是否按預期工作。使用帶有完整名稱及其縮寫的查找可能是一個好主意,然後,作爲第二步,將縮寫改爲全名。 –

0

還有就是要解決這種多方式,但它可能是費時取決於一種清潔你想要做的。

首先,grep只替換一組字符。所以只有當你重複模式發生的時候,它纔是正確的。例如,如果所有「a」都加倍,則可以使用grep將「aa」替換爲「a」。

如果以錯誤方式輸入的狀態數量有限,則可以手動創建一個查找表,並將不正確的值與正確的值相關聯,然後進行合併。或者對每個輸入錯誤的國家進行grep步驟,但會更長。

如果要清理的模式數量很多,則可以使用open refine,它具有半手動羣集功能,並實施了不同的度量標準以輕鬆地羣集您的狀態。