用gsubreplace多个带有重音符号的字母

当然我可以replace这样的具体论点:

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

但肯定有一个更简单的方法来做到这一切线上,对不对? 我没有findgsub的帮助是非常全面的。

使用字符翻译function

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

一个有趣的问题! 我认为最简单的select是devise一个特殊的函数,像“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 } 

这给了我:

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

也许这可能是有用的:

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

另一个使用Reduce mgsub实现

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

上述一些实现(例如,Theodore Lytras)的问题是,如果模式是多个字符,则在一个模式是另一个模式的子串的情况下,它们可能会冲突。 解决这个问题的方法是创build对象的副本并在该副本中执行模式replace。 这是在我的软件包bayesbio中实现的,可在CRAN上find。

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

这是一个testing用例:

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

您可以使用stringi包来replace这些字符。

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

不是那么优雅,但它的工作原理,做你想做的

 > 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" 

这与@kith非常相似,但是在函数forms中,以及最常见的diacritcs情况:

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

“testingaeiou”

您可以使用matchfunction。 这里match(x, y)返回match(x, y)的元素的y的索引。 然后你可以使用返回的索引来为另一个包含x的值replace的向量(比如说z )进行子集合,并与y匹配。 在你的情况下:

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

在一个更简单的例子中,考虑下面的情况,我试图用'alpha''b'代替'beta'等等。

 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)] 

关于贾斯汀的回答:

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

如果需要的话,你可以删除names(*) <- NULL