もちろん、次のような特定の引数を置き換えることもできます。
mydata=c("á","é","ó")
mydata=gsub("á","a",mydata)
mydata=gsub("é","e",mydata)
mydata=gsub("ó","o",mydata)
mydata
しかし、確かにこれをすべてオンラインで行う簡単な方法がありますよね? gsub ヘルプがこれに関して非常に包括的であるとは思いません。
文字翻訳機能を使う
chartr("áéó", "aeo", mydata)
興味深い質問です!最も簡単なオプションは、「マルチ」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"
これは @kith に非常に似ていますが、関数形式であり、最も一般的な分音記号のケースがあります。
removeDiscritics <- function(string) {
chartr(
"ŠŽšžŸÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðñòóôõöùúûüýÿ"
,"SZszYAAAAAACEEEEIIIIDNOOOOOUUUUYaaaaaaceeeeiiiidnooooouuuuyy"
, string
)
}
removeDiscritics("test áéíóú")
「テストあいおう」
上記のいくつかの実装 (たとえば、Theodore Lytras のもの) の問題は、パターンが複数の文字である場合、1 つのパターンが別のパターンの部分文字列である場合に競合する可能性があることです。これを解決する方法は、オブジェクトのコピーを作成し、そのコピーでパターン置換を実行することです。これは私のパッケージ 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)
を使用した別の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)
}
それほどエレガントではありませんが、機能し、必要なことを行います
> 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"