用gsub替换带重音的多个字母

时间:2013-03-06 17:23:58

标签: r regex gsub

当然我可以替换这样的具体参数:

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

但是肯定有一种更容易的方法来完成这一切,对吧? 我没有发现gsub帮助非常全面。

11 个答案:

答案 0 :(得分:78)

使用字符翻译功能

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

答案 1 :(得分:31)

一个有趣的问题!我认为最简单的选择是设计一个特殊的函数,比如“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"

答案 2 :(得分:23)

这可能有用:

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

答案 3 :(得分:9)

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

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

[1] "a" "e" "o"

答案 4 :(得分:7)

使用mgsub

的另一个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) 
}

答案 5 :(得分:6)

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

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

这是一个测试用例:

  asdf = c(4, 0, 1, 1, 3, 0, 2, 0, 1, 1)

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

答案 6 :(得分:6)

这与@kith非常相似,但是在函数形式中,以及最常见的diacritcs案例:

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


removeDiscritics("test áéíóú")
  

“test aeiou”

答案 7 :(得分:3)

不是那么优雅,但它可以工作并做你想做的事情

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

答案 8 :(得分:1)

您可以使用match功能。此处match(x, y)返回y的索引,其中x的元素匹配。然后,您可以使用返回的索引来对另一个向量(例如z)进行子集,该向量包含x值的替换,并与y匹配。在你的情况下:

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

desired[match(mydata, mydata)]

在一个更简单的示例中,请考虑以下情况,我尝试将a替换为'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)]

答案 9 :(得分:1)

与贾斯汀的回答有关:

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

如果你愿意的话,你可以用names(*) <- NULL删除名字。

答案 10 :(得分:0)

在这种情况下,没有太多意义,但是如果它们只有两个,则还可以将它们与gsub结合使用:

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