2016-08-02 8 views
3

Rで整数を指定する関数を探していますが、その長さの組み合わせに単語を分割できますが、ローリング効果があります。その関数が存在する場合単語を長さの組み合わせに分割する

c("stac", "tack", "acko", "ckov", "kove", "over", "verf", "rflo", "flow") 

は、あなたたちは知っていますか私はそれを作成する必要があります。

たとえばfunction("stackoverflow", 4)についてレンダリングでしょうか?

答えて

5
## 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()ではありません。は全く効率的です。これは興味深い観察です!

+0

ニースの答えと1を使用することによってそれを行うことができます。実際、rollapplyは非常に長い文字列のほうが速いですが、 '通常の'長さの文字列の場合は、ベースのRバージョンが高速です(例えば、 'microbenchmark(foo(" stackoverflow "、4)、foo1(" stackoverflow "、4))')。批判を意図せず、完全性のために投稿します。長い文字列の場合は、基本的なR方法を使用する方が高速ですが、 'substring'の代わりに' stringi :: stri_sub'を使用する方が速いです。 – konvas

+0

ありがとうございます。私はforループを使用したくないので、あなたの方が速いです – zemir

4

我々はbase R

substring(s,seq_len(nchar(s)-4+1),4:nchar(s)) 

データ

s <- "stackoverflow" 
関連する問題