Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 将多个字母替换为带gsub的重音符号_R_Regex_Gsub - Fatal编程技术网

R 将多个字母替换为带gsub的重音符号

R 将多个字母替换为带gsub的重音符号,r,regex,gsub,R,Regex,Gsub,当然,我可以替换如下特定参数: mydata=c("á","é","ó") mydata=gsub("á","a",mydata) mydata=gsub("é","e",mydata) mydata=gsub("ó","o",mydata) mydata 但肯定有一个更简单的方法在网上完成这一切,对吗? 我觉得gsub在这方面的帮助不是很全面 一个有趣的问题!我认为最简单的选择是设计一个特殊的函数,比如“multi”gsub(): mgsub使用字符翻

当然,我可以替换如下特定参数:

    mydata=c("á","é","ó")
    mydata=gsub("á","a",mydata)
    mydata=gsub("é","e",mydata)
    mydata=gsub("ó","o",mydata)
    mydata
但肯定有一个更简单的方法在网上完成这一切,对吗?
我觉得gsub在这方面的帮助不是很全面

一个有趣的问题!我认为最简单的选择是设计一个特殊的函数,比如“multi”gsub():


mgsub使用字符翻译功能

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

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

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

另一个
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) 
}
mystring='这很好'
myrepl=list(c('o','a'),c('i','n'))

mgsub2也许这是有用的:

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

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

您可以使用
stringi
package替换这些字符

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

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

这与@kith非常相似,但在函数形式上,最常见的是双圆弧:

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


removeDiscritics("test áéíóú")

removeDiscritics您可以使用
match
功能。这里
match(x,y)
返回
y
的索引,其中
x
的元素被匹配。然后,您可以使用返回的索引对另一个向量(例如
z
)进行子集,该向量包含
x
值的替换,并与
y
适当匹配。就你而言:

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

desired[match(mydata, mydata)]

与Justin的回答相关:

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

在本例中,您可以使用
名称(*)来删除名称,这没有多大意义,但如果它们只有两个,您还可以将它们与gsub结合使用:


mydata如果您想用相同的东西替换不同的模式,则可以使用
lappy
,但由于您想用不同的字符串替换不同的模式,我认为您仍然需要以这样或那样的方式指定这些函数。
gsubfn
包中的
gsubfn
函数是
gsub
的泛化,它可以在一次调用中实现:
gsubfn(“.”,list(“á”=“a”,“é”=“e”,“ó”=“o”)、c(“á”,“é”,“ó”))
@G.Grothendieck。这是伟大的,也适用于所有类型的角色。非常有价值的评论。非常感谢。对于那些正在寻找这个问题更普遍解决方案的人来说,这里有一个更有用的答案:这对角色来说很酷。。。但这是否也适用于特殊字符,例如下划线、点等。。。这不在问题的范围之内,知道这个案子的一些情况也会很有趣…@Joschi,你的问题没有提到它。我想你必须对它们进行转义,因为它们是特殊字符……在我使用的最新版本的R中,调用
iconv('áèèèèèèèèèèèèèèèèèèèè23。行为是否在R版本之间发生了变化,或者这与我的默认编码有关?@Aaron:不知道这是否是编码问题。我在R3.3.1上试过了,并按预期工作。简单而伟大
removeDiscritics <- function(string) {
  chartr(
     "ŠŽšžŸÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðñòóôõöùúûüýÿ"
    ,"SZszYAAAAAACEEEEIIIIDNOOOOOUUUUYaaaaaaceeeeiiiidnooooouuuuyy"
    , string
  )
}


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

desired[match(mydata, mydata)]
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"