Ответ 1
Используйте функцию перевода символов
chartr("áéó", "aeo", mydata)
конечно, я мог бы заменить конкретные аргументы следующим образом:
mydata=c("á","é","ó")
mydata=gsub("á","a",mydata)
mydata=gsub("é","e",mydata)
mydata=gsub("ó","o",mydata)
mydata
но, конечно, есть более простой способ сделать это все в строке onle, правильно? Я не нахожу помощь 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"
Другая реализация 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)
}
Проблема с некоторыми из вышеперечисленных реализаций (например, Теодор Литрас) заключается в том, что если шаблоны представляют собой несколько символов, они могут конфликтовать в случае, если один шаблон является подстрокой другого. Способ решения этой проблемы - создать копию объекта и выполнить замену шаблона в этой копии. Это реализовано в моем пакете 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)
Это очень похоже на @kith, но в форме функции и с наиболее распространенными случаями диакриттов:
removeDiscritics <- function(string) {
chartr(
"ŠŽšžŸÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðñòóôõöùúûüýÿ"
,"SZszYAAAAAACEEEEIIIIDNOOOOOUUUUYaaaaaaceeeeiiiidnooooouuuuyy"
, string
)
}
removeDiscritics("test áéíóú")
"test aeiou"
Не очень элегантный, но он работает и делает то, что вы хотите.
> 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)]
Относительно ответа Джастина:
> m <- c("á"="a", "é"="e", "ó"="o")
> m[mydata]
á é ó
"a" "e" "o"
И вы можете избавиться от имен с помощью names(*) <- NULL
, если хотите.
В этом случае не имеет особого смысла, но если их всего два, вы также можете объединить их с gsub:
mydata <- gsub("á","a", gsub("é","e",mydata))