2013-12-10 13 views
14

Ho alcune stringhe in R nella codifica UTF-8 che contengono accenti. E.g. string="Hølmer" o string="Elizalde-González"Sostituisci caratteri accentati in R con controparte non accentata (codifica UTF-8)

C'è qualche funzione piacevole in R per sostituire i caratteri accentati in queste stringhe dalla controparte non accentata? Ho visto alcune soluzioni in PHP here, ma come faccio a farlo in R?

E.g. il codice PHP

$unwanted_array = array( 'Š'=>'S', 'š'=>'s', 'Ž'=>'Z', 'ž'=>'z', 'À'=>'A', 'Á'=>'A', 'Â'=>'A', 'Ã'=>'A', 'Ä'=>'A', 'Å'=>'A', 'Æ'=>'A', 'Ç'=>'C', 'È'=>'E', 'É'=>'E', 
          'Ê'=>'E', 'Ë'=>'E', 'Ì'=>'I', 'Í'=>'I', 'Î'=>'I', 'Ï'=>'I', 'Ñ'=>'N', 'Ò'=>'O', 'Ó'=>'O', 'Ô'=>'O', 'Õ'=>'O', 'Ö'=>'O', 'Ø'=>'O', 'Ù'=>'U', 
          'Ú'=>'U', 'Û'=>'U', 'Ü'=>'U', 'Ý'=>'Y', 'Þ'=>'B', 'ß'=>'Ss', 'à'=>'a', 'á'=>'a', 'â'=>'a', 'ã'=>'a', 'ä'=>'a', 'å'=>'a', 'æ'=>'a', 'ç'=>'c', 
          'è'=>'e', 'é'=>'e', 'ê'=>'e', 'ë'=>'e', 'ì'=>'i', 'í'=>'i', 'î'=>'i', 'ï'=>'i', 'ð'=>'o', 'ñ'=>'n', 'ò'=>'o', 'ó'=>'o', 'ô'=>'o', 'õ'=>'o', 
          'ö'=>'o', 'ø'=>'o', 'ù'=>'u', 'ú'=>'u', 'û'=>'u', 'ý'=>'y', 'ý'=>'y', 'þ'=>'b', 'ÿ'=>'y'); 
$str = strtr($str, $unwanted_array); 

sembrava abbastanza bello, ma come dovrei farlo in R?

risposta

29

Le risposte seguenti sono sostanzialmente prese da altrove. La chiave è ottenere il tuo unwanted_array nel formato giusto. Si potrebbe desiderare come un list:

unwanted_array = list( 'Š'='S', 'š'='s', 'Ž'='Z', 'ž'='z', 'À'='A', 'Á'='A', 'Â'='A', 'Ã'='A', 'Ä'='A', 'Å'='A', 'Æ'='A', 'Ç'='C', 'È'='E', 'É'='E', 
          'Ê'='E', 'Ë'='E', 'Ì'='I', 'Í'='I', 'Î'='I', 'Ï'='I', 'Ñ'='N', 'Ò'='O', 'Ó'='O', 'Ô'='O', 'Õ'='O', 'Ö'='O', 'Ø'='O', 'Ù'='U', 
          'Ú'='U', 'Û'='U', 'Ü'='U', 'Ý'='Y', 'Þ'='B', 'ß'='Ss', 'à'='a', 'á'='a', 'â'='a', 'ã'='a', 'ä'='a', 'å'='a', 'æ'='a', 'ç'='c', 
          'è'='e', 'é'='e', 'ê'='e', 'ë'='e', 'ì'='i', 'í'='i', 'î'='i', 'ï'='i', 'ð'='o', 'ñ'='n', 'ò'='o', 'ó'='o', 'ô'='o', 'õ'='o', 
          'ö'='o', 'ø'='o', 'ù'='u', 'ú'='u', 'û'='u', 'ý'='y', 'ý'='y', 'þ'='b', 'ÿ'='y') 

Si può fare questo facilmente con iconv o chartr:

> iconv(string, to='ASCII//TRANSLIT') 
[1] "Holmer" 

> chartr(paste(names(unwanted_array), collapse=''), 
     paste(unwanted_array, collapse=''), 
     string) 
[1] "Holmer" 

In caso contrario si deve il ciclo di tutti sostituzioni perché mapply o simili non spiegherebbe simboli già sostituiti dalle precedenti operazioni gsub .:

# the loop: 
out <- string 
for(i in seq_along(unwanted_array)) 
    out <- gsub(names(unwanted_array)[i],unwanted_array[i],out) 

Il risultato:

> out 
[1] "Holmer" 
+2

Ha molte grazie! Non avevo visto gli altri thread - scusa per il fatto che ... iconv (stringa da = "UTF-8", a = "ASCII // TRANSLIT") ha fatto il trucco per me! Grazie mille! –

9

Un'altra opzione è quella di utilizzare gsubfn pacchetto:

library(gsubfn) 
string="Hølmer" 
gsubfn(paste(names(unwanted_array),collapse='|'), unwanted_array,string) 
[1] "Holmer" 
+0

Alcuni problemi di prestazioni con questa soluzione – snoram