当然我可以像这样替换特定的参数:
mydata=c("á","é","ó")
mydata=gsub("á","a",mydata)
mydata=gsub("é","e",mydata)
mydata=gsub("ó","o",mydata)
mydata
但肯定有一种更简单的方法可以在线完成这一切,对吧?我不觉得 gsub 帮助在这方面非常全面。
使用字符翻译功能
chartr("áéó", "aeo", mydata)
一个有趣的问题!我认为最简单的选择是设计一个特殊的函数,比如“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"
您可以使用stringi
包来替换这些字符。
> stri_trans_general(c("á","é","ó"), "latin-ascii")
[1] "a" "e" "o"
这与@kith 非常相似,但采用函数形式,并且使用最常见的变音符号:
removeDiscritics <- function(string) {
chartr(
"ŠŽšžŸÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðñòóôõöùúûüýÿ"
,"SZszYAAAAAACEEEEIIIIDNOOOOOUUUUYaaaaaaceeeeiiiidnooooouuuuyy"
, string
)
}
removeDiscritics("test áéíóú")
“测试 aeiou”
另一种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)
}
上面的一些实现(例如,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)
不是那么优雅,但它可以工作并且做你想要的
> 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"
与贾斯汀的回答相关:
> m <- c("á"="a", "é"="e", "ó"="o")
> m[mydata]
á é ó
"a" "e" "o"
如果你愿意,你可以去掉名字names(*) <- NULL
。
您可以使用该match
功能。这里返回匹配元素match(x, y)
的索引。然后,您可以使用返回的索引对另一个向量(例如)进行子集化,该向量包含 的值的替换,与适当匹配。在你的情况下:y
x
z
x
y
mydata <- c("á","é","ó")
desired <- c('a', 'e', 'o')
desired[match(mydata, mydata)]
在一个更简单的例子中,考虑下面的情况,我试图用、a
for等代替。'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)]
在这种情况下,没有那么多意义,但如果它们只是两个,你也可以将它们与 gsub 结合起来:
mydata <- gsub("á","a", gsub("é","e",mydata))