web-dev-qa-db-ja.com

複数の文字をアクセント付きでgsubに置き換えます

もちろん、私はこのような特定の引数を置き換えることができます:

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

確かに、これをすべて1行で行う簡単な方法がありますよね?これについては、gsubのヘルプが非常に包括的であるとは思いません。

64
Joschi

文字変換機能を使用する

chartr("áéó", "aeo", mydata)
78
kith

興味深い質問です!最も簡単なオプションは、「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"
32
Theodore Lytras

たぶんこれは便利です:

iconv('áéóÁÉÓçã', to="ASCII//TRANSLIT")
[1] "aeoAEOca"
25
Rcoster

stringiパッケージを使用して、これらの文字を置き換えることができます。

> stri_trans_general(c("á","é","ó"), "latin-ascii")

[1] "a" "e" "o"
10
Maciej

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) 
}
7
Ramnath

これは@kithと非常に似ていますが、関数形式で、最も一般的なdiacritcsの場合です:

removeDiscritics <- function(string) {
  chartr(
     "ŠŽšžŸÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðñòóôõöùúûüýÿ"
    ,"SZszYAAAAAACEEEEIIIIDNOOOOOUUUUYaaaaaaceeeeiiiidnooooouuuuyy"
    , string
  )
}


removeDiscritics("test áéíóú")

「テストあいおう」

6
Murta

上記の実装のいくつか(たとえば、Theodore Lytras)の問題は、パターンが複数の文字である場合、あるパターンが別のパターンのサブストリングである場合に競合する可能性があることです。これを解決する方法は、オブジェクトのコピーを作成し、そのコピーでパターン置換を実行することです。これは、CRANで入手可能なbayesbioパッケージに実装されています。

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)
6
Andy McKenzie

それほどエレガントではないが、それは動作し、あなたが望むことをする

> 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"
3
Jilber Urbina

match関数を使用できます。ここで、match(x, y)は、yの要素が一致するxのインデックスを返します。次に、返されたインデックスを使用して、zと適切に一致するxの値の置換を含む別のベクトル(たとえばy)をサブセット化できます。あなたの場合:

mydata <- c("á","é","ó")
desired <- c('a', 'e', 'o')

desired[match(mydata, mydata)]

簡単な例では、'alpha'aに、'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)]
1
justin1.618

ジャスティンの答えに関連:

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

必要に応じて、names(*) <- NULLを使用して名前を削除できます。

1
Dthal

この場合、あまり意味がありませんが、2つだけの場合は、gsubと組み合わせることもできます。

mydata <- gsub("á","a", gsub("é","e",mydata))

0
Maria