Rで整数を指定する関数を探していますが、その長さの組み合わせに単語を分割できますが、ローリング効果があります。その関数が存在する場合単語を長さの組み合わせに分割する
c("stac", "tack", "acko", "ckov", "kove", "over", "verf", "rflo", "flow")
は、あなたたちは知っていますか私はそれを作成する必要があります。
たとえばfunction("stackoverflow", 4)
についてレンダリングでしょうか?
Rで整数を指定する関数を探していますが、その長さの組み合わせに単語を分割できますが、ローリング効果があります。その関数が存在する場合単語を長さの組み合わせに分割する
c("stac", "tack", "acko", "ckov", "kove", "over", "verf", "rflo", "flow")
は、あなたたちは知っていますか私はそれを作成する必要があります。
たとえばfunction("stackoverflow", 4)
についてレンダリングでしょうか?
## install.packages("zoo")
x <- unlist(strsplit("stackoverflow",""))
zoo::rollapply(x,width=4,FUN = paste0,collapse="")
# [1] "stac" "tack" "acko" "ckov" "kove" "over" "verf" "erfl" "rflo" "flow"
機能はありますか?
foo <- function(input, h) {
x <- unlist(strsplit(input,""))
zoo::rollapply(x,width=h,FUN = paste0,collapse="")
}
foo("stackoverflow", 4)
# [1] "stac" "tack" "acko" "ckov" "kove" "over" "verf" "erfl" "rflo" "flow"
ベンチマーク
はsubstring()
とベースRのアプローチを考えてみましょう:
foo1 <- function(input, h) substring(input, seq_len(nchar(input)-h+1),h:nchar(input))
はのは非常に長いおもちゃの文字列を生成してみましょう:
x <- paste0(rep("a",100000), collapse="")
system.time(foo(x,4))
# user system elapsed
# 2.280 0.004 2.288
system.time(foo1(x,4))
# user system elapsed
# 10.492 0.000 10.509
したがって、一見ベクトル化された関数substring()
はではありません。は全く効率的です。これは興味深い観察です!
我々はbase R
substring(s,seq_len(nchar(s)-4+1),4:nchar(s))
データ
s <- "stackoverflow"
ニースの答えと1を使用することによってそれを行うことができます。実際、rollapplyは非常に長い文字列のほうが速いですが、 '通常の'長さの文字列の場合は、ベースのRバージョンが高速です(例えば、 'microbenchmark(foo(" stackoverflow "、4)、foo1(" stackoverflow "、4))')。批判を意図せず、完全性のために投稿します。長い文字列の場合は、基本的なR方法を使用する方が高速ですが、 'substring'の代わりに' stringi :: stri_sub'を使用する方が速いです。 – konvas
ありがとうございます。私はforループを使用したくないので、あなたの方が速いです – zemir