Заменить несколько букв с акцентами с gsub


конечно, я мог бы заменить конкретные аргументы, как это:

    mydata=c("á","é","ó")
    mydata=gsub("á","a",mydata)
    mydata=gsub("é","e",mydata)
    mydata=gsub("ó","o",mydata)
    mydata

но, конечно, есть более простой способ сделать это все в онле линии, не так ли? Я не считаю, что помощь gsub очень всеобъемлюща по этому вопросу.

10 61

10 ответов:

используйте функцию перевода символов

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"

можно использовать

связано с ответом Джастина:

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

и вы можете избавиться от имен с names(*) <- NULL Если вы хотите.