2012-10-29 57 views
1

我試圖用我的大數據框(all_health)替換使用gsub,sub和其他人的村莊名稱,但是我一直在收集一些沒有正確更改的村莊。例如, , 我首先想要在數據中標準化所有村莊的拼寫(vlg)。 如:替換整個村莊的名字?

all_health$vlg<-gsub("FALAJALQBA","FALAJALQABAIL",all_health$vlg) 
all_health$vlg<-gsub("FALAJALQ","FALAJALQABAIL",all_health$vlg) 
all_health$vlg<-gsub("FALAJALQBA","FALAJALQABAIL",all_health$vlg) 
all_health$vlg<-gsub("FALAJALQA","FALAJALQABAIL",all_health$vlg) 
all_health$vlg<-gsub("FALAJALQBAEIL","FALAJALQABAIL",all_health$vlg) 
all_health$vlg<-gsub("FALAJALQBAIL","FALAJALQABAIL",all_health$vlg) 
all_health$vlg<-gsub("FALAJALQUBAIL","FALAJALQABAIL",all_health$vlg) 

然後我想改變所產生的村名到另一個名稱:

all_health$vlg<-gsub("FALAJALQABAIL","ALKHUWAYRIYAH",all_health$vlg) 
然而

,當我重新chaecked村莊的名字,我發現新的不同(錯過了)村莊如(ALKHUWAYRIYAHBAILUBAIL),看起來像一個村莊的組合..

我有很多其他村莊的表現一樣。

我使用正確的功能嗎? 有人會幫我嗎?

+0

是否有一個原因,您正在使用「GSUB」,而不只是「亞健康」的?你能解釋一下all_health $ vlg中每個元素的含義嗎?它是單一村莊名稱,還是多個名稱的連接?一個最小的工作示例會很有幫助。立即看起來「FALAJALQ。*」將是一個更有用的模式來匹配。 – dynamo

+0

謝謝bdh_dtu,我使用了sub函數並得到了相同的結果,vlg變量包含了許多不同拼寫的村莊名稱,至少有200個不同的條目。有時候這些名字是單一的,有時又長又複雜。問題在於,這些名字都是阿拉伯語,醫院的每個職員(我從中得到數據)都有他自己的英文拼寫。 –

回答

0

如果您只是映射名等名稱,你不需要subgsub。我懷疑你遇到了問題,因爲gsub將替換字符串中的任何實例,並且您只希望匹配整個字符串。

嘗試做這兩種中的一種:

#ensures matching of whole string by including 
#start-of-line and end-of-line characters 
all_health$vlg<-gsub("^FALAJALQBA$","FALAJALQABAIL",all_health$vlg) 
#and so on 

#or, use %in%: 
names.to.replace <- c("FALAJALQBA","FALAJALQ") #include all misspelled names 
all_health$vlg[all_health$vlg %in% names.to.replace] <- "FALAJALQABAIL" 
+0

非常感謝你藍色魔導師 解決了問題 –

0

R沒有什麼神奇的方式來找出你所有的拼寫。你需要做的第一件事是...

unique(all_health$vlg) 

通過生成的向量並列出你認爲村莊應該是什麼。並創造一個新的專欄,也許cvlg。保持原始記錄非常重要,因爲您可能會在修復名稱時出錯。

您可能可以使用正則表達式來使其更加簡潔,但似乎有可能出現無法正確使用文字的地方。考慮到示例的第一部分,正則表達式可能會使代碼更簡潔一些。但在這種情況下,我試圖複製和粘貼很多行,使用文字變化並對它們進行評論,因爲您稍後會回頭看看,並且確切地知道您在哪裏更改了某個村莊的名稱,以及它是如何改變的被改變了。

應該導致良好記錄保存的備選方法可能是讓您將唯一向量導出到文件中,並在其中創建一個包含更正名稱的新列。您可以從該文件中導入這兩個向量,並使用新向量輕鬆更改R中的所有名稱。你只需要保留那些首先是錯誤的。

寫出來的名稱使用...

write.table(unique(all_health$vlg)), 'villageNameCorrections.txt', row.names = FALSE, quote = FALSE) 

編輯文件和「老」和「新」適當標記列。現在你的R代碼會是。

correctVlg <- read.table('villageNameCorrections.txt', header = TRUE) 
all_health$cvlg <- all_health$vlg 
all_health$cvlg[all_health$cvlg %in% correctVlg$old] <- 
    correctVlg$new[na.omit(match(ifelse (all_health$cvlg, correctVlg$old))] 
+0

謝謝約翰,我現在會試試... –