2012-05-22 9 views
6

Ich möchte Nicht-ASCII-Zeichen (vorerst nur Spanisch) durch ihre ASCII-Entsprechung ersetzen. Wenn ich "á" habe, möchte ich es durch "a" ersetzen und so weiter.Ersetzen Sie Nicht-Ascii-Zeichen durch eine definierte String-Liste ohne eine Schleife in R

Ich habe diese Funktion (funktioniert gut), aber ich möchte keine Schleife verwenden (einschließlich interner Schleifen wie Sapply).

latin2ascii<-function(x) { 
if(!is.character(x)) stop ("input must be a character object") 
require(stringr) 
mapL<-c("á","é","í","ó","ú","Á","É","Í","Ó","Ú","ñ","Ñ","ü","Ü") 
mapA<-c("a","e","i","o","u","A","E","I","O","U","n","N","u","U") 
for(y in 1:length(mapL)) { 
    x<-str_replace_all(x,mapL[y],mapA[y]) 
    } 
x 
} 

Gibt es einen eleganten Weg, es zu lösen? Jede Hilfe, Anregung oder Modifikation wird geschätzt

Antwort

7

gsubfn() im Paket mit dem gleichen Namen ist wirklich schön für diese Art der Sache:

library(gsubfn) 

# Create a named list, in which: 
# - the names are the strings to be looked up 
# - the values are the replacement strings 
mapL <- c("á","é","í","ó","ú","Á","É","Í","Ó","Ú","ñ","Ñ","ü","Ü") 
mapA <- c("a","e","i","o","u","A","E","I","O","U","n","N","u","U") 

# ll <- setNames(as.list(mapA), mapL) # An alternative to the 2 lines below 
ll <- as.list(mapA) 
names(ll) <- mapL 


# Try it out 
string <- "ÍÓáÚ" 
gsubfn("[áéíóúÁÉÍÓÚñÑüÜ]", ll, string) 
# [1] "IOaU" 

Edit:

G. Grothen weist darauf hin, dass Base R hat auch eine Funktion dafür:

A <- paste(mapA, collapse="") 
L <- paste(mapL, collapse="") 
chartr(L, A, "ÍÓáÚ") 
# [1] "IOaU" 
+0

Vielen Dank! funktioniert perfekt. Nur eine Frage (nur zu wissen); Weißt du, ob die Funktion gsubfn irgendeine Art von interner Schleife verwendet? Sollte schneller sein als sapply? –

+0

@ Álvaro - Ich glaube nicht, 'gsubfn()' ist besonders schnell - 'einfach' bequem und elegant. –

+1

Siehe auch 'chartr' in der Basis von R, was für das angegebene Problem in Ordnung scheint. Wenn es jedoch Variationen im realen Problem gibt, wie zum Beispiel das Ersetzen von zwei Zeichenfolgen, könnte 'gsubfn' noch damit umgehen, aber nicht' chartr'. –

2

Ich mag die Version von Josh, aber ich dachte, ich könnte ein hinzufügen andere "vektorisierte" Lösung. Es gibt einen Vektor mit nicht akzentuierten Strings zurück. Es stützt sich auch nur auf die base Funktionen.

x=c('íÁuÚ','uíÚÁ') 

mapL<-c("á","é","í","ó","ú","Á","É","Í","Ó","Ú","ñ","Ñ","ü","Ü") 
mapA<-c("a","e","i","o","u","A","E","I","O","U","n","N","u","U") 
split=strsplit(x,split='') 
m=lapply(split,match,mapL) 
mapply(function(split,m) paste(ifelse(is.na(m),split,mapA[m]),collapse='') , split, m) 
# "iAuU" "uiUA" 
Verwandte Themen