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

Posted

技术标签:

【中文标题】用 gsub 替换带有重音符号的多个字母【英文标题】:Replace multiple letters with accents with gsub 【发布时间】:2013-02-21 15:12:53 【问题描述】:

当然我可以像这样替换特定的参数:

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

但肯定有一种更简单的方法可以在线完成这一切,对吧? 我不觉得 gsub 帮助在这方面非常全面。

【问题讨论】:

如果你想用相同的东西替换不同的模式,lapply应该是可能的,但是你想用不同的字符串替换不同的模式,我认为你仍然需要指定这些一种或另一种方式... 您可以使用chartr 来执行此操作。 gsubfn 包中的gsubfn 函数是gsub 的泛化,可以一次调用:gsubfn(".", list("á"="a", "é"="e", "ó"="o"), c("á","é","ó")) @G.Grothendieck。这很棒,也适用于所有类型的角色。非常有价值的评论。谢谢! 对于寻找此问题更通用解决方案的人,这里有一个更有帮助的答案:***.com/a/7664655/1036500 【参考方案1】:

使用字符翻译功能

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

【讨论】:

这对字符来说很酷......但这也适用于特殊字符,例如下划线,点等...这不在问题范围内,对于这种情况了解一些东西仍然会很有趣... @Joschi,您的问题没有涉及。我认为您必须逃避它们,因为它们是特殊字符...【参考方案2】:

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

【讨论】:

【参考方案3】:

也许这会有用:

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

【讨论】:

在最新版本的 R 中,我使用调用 iconv('áéóÁÉÓçã', to="ASCII//TRANSLIT") 返回 "'a'e'o'A'E'Oc~a"。 R 版本之间的行为是否发生了变化,还是与我的默认编码有关? @Aaron:不知道是不是编码问题。我在这里尝试了 R 3.3.1 并按预期工作。【参考方案4】:

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

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

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

【讨论】:

【参考方案5】:

这与@kith 非常相似,但采用函数形式,并且使用最常见的变音符号:

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



removeDiscritics("test áéíóú")

“测试 aeiou”

【讨论】:

【参考方案6】:

另一个使用Reducemgsub实现

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】:

上述一些实现(例如 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)

【讨论】:

【参考方案8】:

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

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

【讨论】:

【参考方案9】:

与贾斯汀的回答有关:

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

如果你愿意,你可以去掉names(*) &lt;- NULL 的名字。

【讨论】:

【参考方案10】:

您可以使用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)]

【讨论】:

【参考方案11】:

在这种情况下,没有那么多意义,但如果它们只是两个,你也可以将它们与gsub结合起来:

mydata &lt;- gsub("á","a", gsub("é","e",mydata))

【讨论】:

以上是关于用 gsub 替换带有重音符号的多个字母的主要内容,如果未能解决你的问题,请参考以下文章

在 ASCII/UTF8 中转换带有重音符号的 Unicode 字母

用英语等价物替换德语字符(变音符号、重音符号)

Bibtex 错误地编译重音符号

unicode排序规则,汉字怎么区分大小写,区分重音,区分假名,区分宽度

用普通的ascii字符替换重音字符[重复]

MailMessage 带重音符号的附件文件名