1

最初のベクトルがあります。1 と -1 だけで構成される x としましょう。次に、1、-1、およびゼロで構成される 2 番目のベクトル y があります。x[i]ここで、インデックス ia 1が 1 に等しく、1 がベクトル y 内の n 個の先行要素の間に存在する場合に含むベクトル z を作成したいと思います(y[(i-n):i])...

より正式には:z <- ifelse(x == 1 && 1 %in% y[(index(y)-n):index(y)],1,0)

ループや再帰を使わずに R でそのようなベクトルを作成しようとしています。y[(index(y)-n):index(y)]上記の命題は、要素ごとに式を取得することを認識しないため、機能しません。

協力してくれてありがとうございます

4

2 に答える 2

3

関数を使用して、cumsumこれまでに見られたものの数をテストする方法を次に示します。position の 1 の数が position のi1 の数より多い場合i-n、右側の条件が満たされます。

## Generate some random y's.
> y <- sample(-1:1, 25, replace=T)
> y
 [1]  0  1 -1 -1 -1 -1 -1  1 -1 -1 -1 -1  0  0 -1 -1 -1  1 -1  1  1  0  0  0  1
> n <- 3
## Compute number of ones seen at each position.
> cs <- cumsum(ifelse(y == 1, 1, 0))
> lagged.cs <- c(rep(0, n), cs[1:(length(cs)-n)])
> (cs - lagged.cs) > 0
 [1] FALSE  TRUE  TRUE  TRUE FALSE FALSE FALSE  TRUE  TRUE  TRUE FALSE FALSE
[13] FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE
[25]  TRUE
于 2010-08-16T09:32:08.577 に答える
1

このように使用することもできますがapply、基本的にはループを実行するためのかなりの方法ですが、高速になるかどうかはわかりません (そうである場合とそうでない場合があります)。

y1 <- unlist(lapply(1:length(x), function(i){1 %in% y[max(0, (i-n)):i]}))
z <- as.numeric(x==1) * as.numeric(y1)
于 2010-08-16T06:29:53.190 に答える