当然,我可以这样替换特定的参数:
mydata=c("á","é","ó")
mydata=gsub("á","a",mydata)
mydata=gsub("é","e",mydata)
mydata=gsub("ó","o",mydata)
mydata
但是肯定有一种更简单的方法可以在线完成所有操作,对吗?我发现gsub在这方面的帮助不是很全面。
当然,我可以这样替换特定的参数:
mydata=c("á","é","ó")
mydata=gsub("á","a",mydata)
mydata=gsub("é","e",mydata)
mydata=gsub("ó","o",mydata)
mydata
但是肯定有一种更简单的方法可以在线完成所有操作,对吗?我发现gsub在这方面的帮助不是很全面。
chartr
此功能。
gsubfn
函数gsubfn
是一个概括的函数gsub
,可以一次调用完成该任务: gsubfn(".", list("á"="a", "é"="e", "ó"="o"), c("á","é","ó"))
Answers:
一个有趣的问题!我认为最简单的选择是设计一个特殊功能,例如“ 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"
iconv('áéóÁÉÓçã', to="ASCII//TRANSLIT")
返回"'a'e'o'A'E'Oc~a"
。行为是否在R版本之间发生了变化,还是与我的默认编码有关?
上面的某些实现(例如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"
您可以使用该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)]
lapply
,但是当您想用不同的字符串替换不同的模式时,我认为您仍然必须以一种或另一种方式指定这些模式...