2016-07-29 55 views
0

我正在使用以下dataset,其中包含墨西哥32個州中的每個州的平均氣溫。如何清理R中的字符串列(大寫字母和重音符號)?

library(data.table) 

# Read data from website 
col.names <- c('ENTIDAD', 'ANYO', 'ENERO', 'FEBRERO', 'MARZO', 'ABRIL', 'MAYO', 'JUNIO', 
      'JULIO', 'AGOSTO', 'SEPTIEMBRE', 'OCTUBRE', 'NOVIEMBRE', 'DICIEMBRE', 'UNIDAD') 
temperature <- fread('http://201.116.60.46/DatosAbiertos/Temperatura_promedio.csv', 
       col.names = col.names) 

ENTIDAD列有32個狀態名稱。然而,所有的名字出現在大寫字母,並且有取代它應該有重音的字母一些奇怪的數字:

unique(temperature$ENTIDAD) 
[1] "AGUASCALIENTES"     "BAJA CALIFORNIA"     
[3] "BAJA CALIFORNIA SUR"    "CAMPECHE"      
[5] "COAHUILA DE ZARAGOZA"   "COLIMA"       
[7] "CHIAPAS"       "CHIHUAHUA"      
[9] "DISTRITO FEDERAL"    "DURANGO"       
[11] "GUANAJUATO"      "GUERRERO"      
[13] "HIDALGO"       "JALISCO"       
[15] "M\311XICO"      "MICHOAC\301N DE OCAMPO"   
[17] "MORELOS"       "NAYARIT"       
[19] "NUEVO LE\323N"     "OAXACA"       
[21] "PUEBLA"       "QUER\311TARO"     
[23] "QUINTANA ROO"     "SAN LUIS POTOS\315"    
[25] "SINALOA"       "SONORA"       
[27] "TABASCO"       "TAMAULIPAS"      
[29] "TLAXCALA"      "VERACRUZ DE IGNACIO DE LA LLAVE" 
[31] "YUCAT\301N"      "ZACATECAS" 

有一個簡單的方法有以下字符串替換每個這些?

states <- c('Aguascalientes', 
'Baja California', 
'Baja California Sur', 
'Campeche', 
'Chiapas', 
'Chihuahua', 
'Coahuila', 
'Colima', 
'DF', 
'Durango', 
'Guanajuato', 
'Guerrero', 
'Hidalgo', 
'Jalisco', 
'Michoacan', 
'Morelos', 
'Mexico', 
'Nayarit', 
'Nuevo Leon', 
'Oaxaca', 
'Puebla', 
'Queretaro', 
'Quintana Roo', 
'San Luis Potosi', 
'Sinaloa', 
'Sonora', 
'Tabasco', 
'Tamaulipas', 
'Tlaxcala', 
'Veracruz', 
'Yucatan', 
'Zacatecas') 
+0

在我看來,這是一個基於R對非ASCII字符的默認處理的讀入問題,嘗試調整fread的'encoding ='參數? – Nate

+0

我試過了不同的編碼選項:「UTF-8」和「Latin-1」,但結果是一樣的。 – jroberayalas

+1

當我運行'fread(...,encoding =「Latin-1」)'我得到原始重音元音完好的名字... – Nate

回答

1

看起來您已將替換名稱更改爲unique(temperature$ENTIDAD)中的名稱。

如果你已經擁有你想要改變舊名稱可以使用mapvaluesplyr包更改名稱的名稱:

temperatures$ENTIDAD <- mapvalues(temperature$ENTIDAD, from=unique(temperature$ENTIDAD), to=states) 
+0

這個工作很好。謝謝! – jroberayalas

1

我認爲這將解決你的問題:

temperature <- fread('http://201.116.60.46/DatosAbiertos/Temperatura_promedio.csv', 
       col.names = col.names, encoding = "Latin-1") 
+0

我以前試過這個,但是我得到像「M XICO」,「QUER TARO」,「YUCAT N」等字符串,...不知道如何處理部分。 – jroberayalas

+0

很奇怪,我想知道爲什麼我們的代碼不會產生相同的輸出 – Nate

0

您可以設置編碼(可能是通過FREAD更好),並使用tolower的較低的情況下,

x <- temperature$ENTIDAD 
Encoding(x) <- "latin1" 
# might also want to convert to utf8 
# x <- iconv(x, "latin1", "UTF-8") 
cbind(x, tolower(x)) 
相關問題