2016-10-24 7 views
0

私は基本的に1000バイナリ値のベクトルを作成する関数を作成しました。私はrleを使って連続1秒の最長ストリークを数えることができました。rのベクトルの文字列を見つけるには?

この大きなベクターで特定のベクター(たとえばc(1,0,0,1))を見つけるにはどうすればいいですか?私はそれがそのベクトルの出現量を返すことを望むでしょう。 c(1,0,0,0,1)私はちょうどシーケンスが全く発生しているかどうかを見つけるとTRUEまたはFALSEを返す発見した、または、彼らは個々の値ではなく、特定のベクトルの結果を与える0

ほとんどのソリューションを返す必要がありながら、そうc(1,0,0,1,1,0,0,1)は、2を返す必要があります指定されています。

はここで、これまでに私のコードです:

# creates a function where a 1000 people choose either up or down. 
updown <- function(){ 
    n = 1000 
    X = rep(0,n) 
    Y = rbinom(n, 1, 1/2) 
    X[Y == 1] = "up" 
    X[Y == 0] = "down" 

    #calculate the length of the longest streak of ups: 
    Y1 <- rle(Y) 
    streaks <- Y1$lengths[Y1$values == c(1)] 
    max(streaks, na.rm=TRUE) 
} 

# repeat this process n times to find the average outcome. 
longeststring <- replicate(1000, updown()) 
longeststring(p_vals) 

答えて

1

Yのみ0 sおよび1秒であるので、我々は文字列にそれをpasteし、正規表現を使用し、特にgregexprことができます。簡略化ビット:

set.seed(47) # for reproducibility 

Y <- rbinom(1000, 1, 1/2) 

count_pattern <- function(pattern, x){ 
    sum(gregexpr(paste(pattern, collapse = ''), 
       paste(x, collapse = ''))[[1]] > 0) 
} 

count_pattern(c(1, 0, 0, 1), Y) 
## [1] 59 

pasteパターンと文字列にダウンY、例えばを低減しますここではパターンの場合は"1001"Yの場合は1000文字の文字列です。 gregexprは、Yのパターンのすべての出現を検索し、一致のインデックスを返します(必要に応じて、それらを抽出できるように少し詳細な情報と共に)。 gregexprは一致しないために-1を返すので、0より大きい数値をテストすると、TRUEの値を単純に合算してmacthesの数を取得できます。この場合には、59

言及した他のサンプル例:

count_pattern(c(1,0,0,1), c(1,0,0,1,1,0,0,1)) 
## [1] 2 

count_pattern(c(1,0,0,1), c(1,0,0,0,1)) 
## [1] 0 
2

また、これは動作します:

library(stringr) 
x <- c(1,0,0,1) 
y <- c(1,0,0,1,1,0,0,1) 
length(unlist(str_match_all(paste(y, collapse=''), '1001'))) 
[1] 2 
y <- c(1,0,0,0,1) 
length(unlist(str_match_all(paste(y, collapse=''), '1001'))) 
[1] 0 

あなたが重なり合ったパターンに一致するようにしたい場合は、

y <- c(1,0,0,1,0,0,1) # overlapped 
length(unlist(gregexpr("(?=1001)",paste(y, collapse=''),perl=TRUE))) 
[1] 2 
+0

@実際に私たちはルックアヘッドアサーションを使用する必要がある鳳天、コードを更新し、それが動作しない場合は私に知らせてください。 –

+0

私はそれを得た。あなたが正しいです。 –

関連する問題