Ersetzen Sie mehrere Buchstaben durch Akzente mit gsub

Natürlich könnte ich bestimmte Argumente wie folgt ersetzen:

mydata=c("á","é","ó") mydata=gsub("á","a",mydata) mydata=gsub("é","e",mydata) mydata=gsub("ó","o",mydata) mydata 

aber sicherlich gibt es einen einfacheren Weg, dies alles in onle line zu tun, richtig? Ich finde nicht, dass die GSUB-Hilfe sehr umfassend ist.

   

    Verwenden Sie die Zeichenübersetzungsfunktion

     chartr("áéó", "aeo", mydata) 

    Eine interessante Frage! Ich denke, die einfachste Option ist es, eine spezielle function zu entwickeln, etwas wie ein “multi” gsub ():

     mgsub < - function(pattern, replacement, x, ...) { if (length(pattern)!=length(replacement)) { stop("pattern and replacement do not have the same length.") } result <- x for (i in 1:length(pattern)) { result <- gsub(pattern[i], replacement[i], result, ...) } result } 

    Was gibt mir:

     > mydata < - c("á","é","ó") > mgsub(c("á","é","ó"), c("a","e","o"), mydata) [1] "a" "e" "o" 

    Vielleicht kann das nützlich sein:

     iconv('áéóÁÉÓçã', to="ASCII//TRANSLIT") [1] "aeoAEOca" 

    Sie können das stringi , um diese Zeichen zu ersetzen.

     > stri_trans_general(c("á","é","ó"), "latin-ascii") [1] "a" "e" "o" 

    Eine weitere mgsub Implementierung mit Reduce

     mystring = 'This is good' myrepl = list(c('o', 'a'), c('i', 'n')) mgsub2 < - function(myrepl, mystring){ gsub2 <- function(l, x){ do.call('gsub', list(x = x, pattern = l[1], replacement = l[2])) } Reduce(gsub2, myrepl, init = mystring, right = T) } 

    Ein Problem mit einigen der obigen Implementierungen (z. B. Theodore Lytras) besteht darin, dass, wenn die Muster mehrere Zeichen haben, sie in Konflikt geraten können, falls ein Muster Teilzeichenfolge eines anderen ist. Eine Möglichkeit, dies zu lösen, besteht darin, eine Kopie des Objekts zu erstellen und die Musterersetzung in dieser Kopie durchzuführen. Dies ist in meinem Paket bayesbio implementiert, das auf CRAN verfügbar ist.

     mgsub < - function(pattern, replacement, x, ...) { n = length(pattern) if (n != length(replacement)) { stop("pattern and replacement do not have the same length.") } result = x for (i in 1:n) { result[grep(pattern[i], x, ...)] = replacement[i] } return(result) } 

    Hier ist ein Testfall:

      asdf = c(4, 0, 1, 1, 3, 0, 2, 0, 1, 1) res = mgsub(c("0", "1", "2"), c("10", "11", "12"), asdf) 

    Dies ist sehr ähnlich zu @kith, aber in functionsform und mit den gebräuchlichsten Diacrit-Fällen:

     removeDiscritics < - function(string) { chartr( "ŠŽšžŸÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðñòóôõöùúûüýÿ" ,"SZszYAAAAAACEEEEIIIIDNOOOOOUUUUYaaaaaaceeeeiiiidnooooouuuuyy" , string ) } removeDiscritics("test áéíóú") 

    "test aeiou"

    Nicht so elegant, aber es funktioniert und macht was du willst

     > diag(sapply(1:length(mydata), function(i, x, y) { + gsub(x[i],y[i], x=x) + }, x=mydata, y=c('a', 'b', 'c'))) [1] "a" "b" "c" 

    Sie können die match function verwenden. Hier gibt match(x, y) den Index von y wo das Element von x übereinstimmt. Dann können Sie die zurückgegebenen Indizes verwenden, um einen anderen Vektor ( z B. z ) zu unterteilen, der die Ersetzungen für die Werte von x , die passend mit y übereinstimmen. In Ihrem Fall:

     mydata < - c("á","é","ó") desired <- c('a', 'e', 'o') desired[match(mydata, mydata)] 

    Betrachten Sie in einem einfacheren Beispiel die folgende Situation, in der ich versuchte, für 'alpha' , 'b' für 'beta' und so weiter zu ersetzen.

     x < - c('a', 'a', 'b', 'c', 'b', 'c', 'e', 'e', 'd') y <- c('a', 'b', 'c', 'd', 'e') z <- c('alpha', 'beta', 'gamma', 'delta', 'epsilon') z[match(x, y)] 

    Bezogen auf Justins Antwort:

     > m < - c("á"="a", "é"="e", "ó"="o") > m[mydata] á é ó "a" "e" "o" 

    Und Sie können die Namen mit names(*) < - NULL loswerden, wenn Sie möchten.