wake-up-neo.com

Ersetzen Sie mehrere Buchstaben durch Akzente durch 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 es gibt sicher einen einfacheren Weg, dies alles online zu tun, oder? Ich finde nicht, dass die gsub-hilfe dazu sehr umfassend ist. 

62
Joschi

Verwenden Sie die Zeichenübersetzungsfunktion

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

Eine interessante Frage! Ich denke, die einfachste Möglichkeit besteht darin, eine spezielle Funktion zu entwickeln, etwa 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"
31
Theodore Lytras

Vielleicht kann dies nützlich sein: 

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

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

> stri_trans_general(c("á","é","ó"), "latin-ascii")

[1] "a" "e" "o"
8
Maciej

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) 
}
7
Ramnath

Dies ist @kith sehr ähnlich, jedoch in Funktionsform und bei den häufigsten diakritischen Fällen:

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


removeDiscritics("test áéíóú")

"test aeiou"

6
Murta

Ein Problem bei einigen der obigen Implementierungen (z. B. Theodore Lytras) besteht darin, dass, wenn die Muster aus mehreren Zeichen bestehen, sie in Konflikt treten können, falls ein Muster ein Teilstring eines anderen ist. Um dies zu lösen, können Sie eine Kopie des Objekts erstellen und das Muster in dieser Kopie ersetzen. 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)
6
Andy McKenzie

Nicht so elegant, aber es funktioniert und macht, was Sie wollen

> 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"
3
Jilber Urbina

Sie können die Funktion match verwenden. Hier gibt match(x, y) den Index von y zurück, bei dem das Element von x übereinstimmt. Dann können Sie die zurückgegebenen Indizes verwenden, um einen anderen Vektor (z. B. z) zu subsetieren, der die Ersetzungen für die Werte von x enthält, die entsprechend mit y übereinstimmen. In Ihrem Fall:

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

desired[match(mydata, mydata)]

Betrachten Sie in einem einfacheren Beispiel die Situation unten, in der ich versuchte, a 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)]
1
justin1.618

Verwandte Antwort von Justin:

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

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

1
Dthal

In diesem Fall hat nicht so viel Sinn, aber wenn es nur zwei sind, können Sie sie auch mit gsub kombinieren:

mydata <- gsub("á","a", gsub("é","e",mydata))

0
Maria