2016-07-29 105 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)) 
相关问题