Natürlich könnte ich bestimmte Argumente wie dieses ersetzen:
mydata=c("á","é","ó")
mydata=gsub("á","a",mydata)
mydata=gsub("é","e",mydata)
mydata=gsub("ó","o",mydata)
mydata
Aber es gibt sicherlich einen einfacheren Weg, dies alles in einer einzigen Linie zu tun, oder? Ich finde die gsub-Hilfe nicht sehr umfassend.
lapply
ersetzen möchten , sollte dies möglich sein , aber da Sie verschiedene Muster durch unterschiedliche Zeichenfolgen ersetzen möchten, müssen Sie diese auf die eine oder andere Weise noch angeben ...chartr
Sie dies verwenden.gsubfn
Funktion imgsubfn
Paket ist eine Verallgemeinerunggsub
, die dies in einem Aufruf tun kann:gsubfn(".", list("á"="a", "é"="e", "ó"="o"), c("á","é","ó"))
Antworten:
Verwenden Sie die Zeichenübersetzungsfunktion
chartr("áéó", "aeo", mydata)
quelle
Eine interessante Frage! Ich denke, die einfachste Möglichkeit besteht darin, eine spezielle Funktion zu entwickeln, so 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 }
Welches gibt mir:
> mydata <- c("á","é","ó") > mgsub(c("á","é","ó"), c("a","e","o"), mydata) [1] "a" "e" "o"
quelle
Vielleicht kann dies nützlich sein:
iconv('áéóÁÉÓçã', to="ASCII//TRANSLIT") [1] "aeoAEOca"
quelle
iconv('áéóÁÉÓçã', to="ASCII//TRANSLIT")
zurückgegeben"'a'e'o'A'E'Oc~a"
. Hat sich das Verhalten in den R-Versionen geändert oder hat dies mit meiner Standardcodierung zu tun?Sie können das
stringi
Paket verwenden, um diese Zeichen zu ersetzen.> stri_trans_general(c("á","é","ó"), "latin-ascii") [1] "a" "e" "o"
quelle
Dies ist @kith sehr ähnlich, jedoch in Funktionsform und mit den häufigsten diakritischen Fällen:
removeDiscritics <- function(string) { chartr( "ŠŽšžŸÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðñòóôõöùúûüýÿ" ,"SZszYAAAAAACEEEEIIIIDNOOOOOUUUUYaaaaaaceeeeiiiidnooooouuuuyy" , string ) } removeDiscritics("test áéíóú")
quelle
Eine andere
mgsub
Implementierung mitReduce
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) }
quelle
Ein Problem bei einigen der oben genannten Implementierungen (z. B. bei Theodore Lytras) besteht darin, dass die Muster, wenn sie aus mehreren Zeichen bestehen, in Konflikt geraten können, wenn ein Muster ein Teilstring 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)
quelle
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"
quelle
Sie können die
match
Funktion verwenden. Hier wirdmatch(x, y)
der Index zurückgegeben, any
dem das Element vonx
ü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 enthältx
, die entsprechend mit übereinstimmeny
. In Ihrem Fall:mydata <- c("á","é","ó") desired <- c('a', 'e', 'o') desired[match(mydata, mydata)]
In einem einfacheren Beispiel betrachten wir die Situation unten, wo ich zu ersetzen versuchte ,
a
für'alpha'
,'b'
für'beta'
und so weiter.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)]
quelle
Bezogen auf Justins Antwort:
> m <- c("á"="a", "é"="e", "ó"="o") > m[mydata] á é ó "a" "e" "o"
Und Sie können die Namen mit loswerden,
names(*) <- NULL
wenn Sie wollen.quelle
In diesem Fall hat das nicht so viel Sinn, aber wenn es nur zwei sind, können Sie sie auch mit gsub kombinieren:
mydata <- gsub("á","a", gsub("é","e",mydata))
quelle