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"