9

私は次のベクトルを持っています

 v = c(F, F, F, T, F, F, F, F, F, T, F, F, F)

ベクトル化された操作を使用して、各 v TRUE 要素の前の 2 つの要素と次の 2 つの要素も TRUE に設定されるように v を変更するにはどうすればよいですか? つまり、結果は次のようになります。

 F, T, T, T, T, T, F, T, T, T, T, T, F

もちろん、これは各 v 要素のループで実行できますが、この種の操作をベクトル化できるかどうかを知りたいです。また、この質問とは異なり、v の要素は独立しており、それぞれに対して計算を実行する必要はありません。これは純粋なインデックスの問題です。

4

4 に答える 4

11

こののものは、おそらくあなたが得ようとしているのと同じくらいベクトル化されています:

v[unlist(sapply(which(v),function(x) {x + c(-2,-1,1,2)},simplify = FALSE))] <- TRUE
> v
 [1] FALSE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE

ただし、ベクトルの両端にある TRUE 要素で何が起こるかを指定していないことに注意してください。それにはさらに多くの作業が必要になります。また、2 つの TRUE 要素が互いに 2 位置よりも近い場合にどうなるかも指定しません。

または:

v[outer(which(v),c(-2,-1,1,2),"+")] <- TRUE
> v
 [1] FALSE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE

基本的なレベルでは、ここでも同じことを行っていますが、2 番目のオプションの方が確かにコンパクトですが、理解するのは難しいかもしれません。

于 2013-04-24T19:43:35.010 に答える
1

さらに別のアプローチ。ラグ付きベクトルのセットを作成し、orそれらを一緒にします。

library(Hmisc)
library(functional)
within.distance <- function(x, d=2) {
  FLag <- function(x, shift) {
    x <- Lag(x, shift)
    x[is.na(x)] <- FALSE
    return(x)
  }

  l <- lapply((-d):d, Curry(FLag, x=x))
  return(Reduce(`|`, l))
}
于 2013-04-25T03:07:43.523 に答える