アルファベット[a-z]、スペース[]、アポストロフィ[']などを含む文字列変数があります。 _x <- "a'b c"
_アポストロフィ[']を空白[]に置き換え、スペース[]をアンダースコア[_]に置き換えたい。
_x <- gsub("'", "", x)
x <- gsub(" ", "_", x)
_
それは絶対に機能しますが、私が多くの状態を持っているとき、コードはくなります。したがって、chartr()
を使用したいのですが、chartr()
は空白を処理できません。
_x <- chartr("' ", "_", x)
#Error in chartr("' ", "_", "a'b c") : 'old' is longer than 'new'
_
この問題を解決する方法はありますか?ありがとう!
gsubfn
を使用できます
library(gsubfn)
gsubfn(".", list("'" = "", " " = "_"), x)
# [1] "ab_c"
同様に、mgsub
を使用して、複数のパターンで複数の置換を検索することもできます。
mgsub::mgsub(x, c("'", " "), c("", "_"))
#[1] "ab_c"
私は、magrittr
パッケージの%<>%
および%>%
演算子が提供する構文のファンです。
library(magrittr)
x <- "a'b c"
x %<>%
gsub("'", "", .) %>%
gsub(" ", "_", .)
x
##[1] "ab_c"
gusbfn
は素晴らしいですが、%>%
が許可されているチェーンが好きです。
magrittr
および/またはdplyr
ソリューションも選択します。ただし、特に関数内にあり、安価に返すことができる場合は、オブジェクトの新しいコピーを作成しないことをお勧めします。
つまり.
return(
catInTheHat %>% gsub('Thing1', 'Thing2', .) %>% gsub('Red Fish', 'Blue
Fish', .)
)
...等々。
gsub("\\s", "", chartr("' ", " _", x)) # Use whitespace and then remove it
非常に高速な関数stri_replace_all_fixed
ライブラリーから( stringi ):
library(stringi)
stri_replace_all_fixed("a'b c", pattern = c("'", " "), replacement = c("", "_"), vectorize_all = FALSE)
他の推奨されるsoultionのほとんどを考慮したベンチマークは次のとおりです。
library(stringi)
library(microbenchmark)
library(gsubfn)
library(mgsub)
library(magrittr)
library(dplyr)
x_gsubfn <-
x_mgsub <-
x_nested_gsub <-
x_magrittr <-
x_stringi <- "a'b c"
microbenchmark("gsubfn" = { gsubfn(".", list("'" = "", " " = "_"), x_gsubfn) },
"mgsub" = { mgsub::mgsub(x_mgsub, c("'", " "), c("", "_")) },
"nested_gsub" = { gsub("Find", "Replace", gsub("Find","Replace", x_nested_gsub)) },
"magrittr" = { x_magrittr %<>% gsub("'", "", .) %>% gsub(" ", "_", .) },
"stringi" = { stri_replace_all_fixed(x_stringi, pattern = c("'", " "), replacement = c("", "_"), vectorize_all = FALSE) }
)
Unit: microseconds
expr min lq mean median uq max neval
gsubfn 458.217 482.3130 519.12820 513.3215 538.0100 715.371 100
mgsub 180.521 200.8650 221.20423 216.0730 231.6755 460.587 100
nested_gsub 14.615 15.9980 17.92178 17.7760 18.7630 40.687 100
magrittr 113.765 133.7125 148.48202 142.9950 153.0680 296.261 100
stringi 3.950 7.7030 8.41780 8.2960 9.0860 26.071 100
ネストされたgsubが仕事をするだろうと思います。
gsub("Find","Replace",gsub("Find","Replace",X))