3

次のようなベクトルが与えられた場合

> x
 [1] 1 1 2 1 1 1 5 1 1 1 5 7 1 1 1 1 1 1 1 1 1

要素を n 回複製したい -- しかし、複製によって古い要素を上書きしたい。基本的な rep 関数を使用すると、次のようになります。

> rep(x,x)
 [1] 1 1 2 2 1 1 1 5 5 5 5 5 1 1 1 5 5 5 5 5 7 7 7 7 7 7 7 1 1 1 1 1 1 1 1 1

これは、元のシフトされていない隣接要素を右にシフトするだけです。しかし、隣接する各要素を複製された値で繰り返し上書きする場合 (ここでは、各要素を左から右に置き換えて段階的に)、次のようになります...

112111511157111111111
112211511157111111111
112211555557111111111
112211555555555111111
112211555557777777111

N回複製された要素ごとに、N個の隣接する右隣を上書きすることに注意してください。ループでこれを行うこともできますが、それを行うための高速なベクターベースのアプローチはありますか?

na.locf は近い (1 を NA に事前設定) ですが、(私が理解しているように) 正確に N 個の右の隣人ではなく、すべてまたは右端の NA の固定数のみを rep 値で埋めます。

考えられる代替手段は、元のゼロの代わりにすべてゼロを配置し、要素を N 回だけ繰り返してバイナリ 1 の値で上書きすることです。たとえば、上記のようになります...例:

x<-  c(0, 0, 2, 0, 0, 0, 5, 0, 0, 0, 5, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0)
sig<-c(0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0)

編集:明確にするために、任意の数の繰り返し可能な要素にコンパクトに拡張する必要があります(rep関数と同じ)。

4

2 に答える 2

0
x <- c(0, 0, 2, 0, 0, 0, 5, 0, 0, 0, 5, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0)

dumFun <- function(a,b,c){rep(c(0,1,0), times = c(a-1,b,max(c-b-a+1,0)))}
1*Reduce('|', 
      mapply(dumFun, a = seq_along(x), b = x, c =length(x), SIMPLIFY= FALSE))

 [1] 0 0 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0

これにより、x に従って 1 で埋められたゼロのベクトルのリストが生成されます。次に、OR 演算をリストの各要素に連続して適用します。

これを関数でラップできます。

getSignal <- function(x){
    dumFun <- function(a,b,c){
                    rep(c(0,1,0), times = c(a,b,max(c-b-a,0)))
                  }
    1*Reduce('|', 
        mapply(dumFun, a = seq_along(x)-1, b = x, c =length(x),
                                                       SIMPLIFY= FALSE))
}

同様のアイデアを適用して、最初の問題を処理することもできます。

getRep <- function(x){
    dumFun <- function(a,b,c){
                    rep(c(0,b,0), times = c(a,b,max(c-b-a,0)))
          }
    Reduce('pmax',
        mapply(dumFun, a = seq_along(x)-1, b = x, c =length(x),
                                                       SIMPLIFY= FALSE))
}

y <- c(1, 1, 2, 1, 1, 1, 5, 1, 1, 1, 5, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1)
getRep(y)
 [1] 1 1 2 2 1 1 5 5 5 5 5 7 7 7 7 7 7 7 1 1 1
于 2013-05-30T02:16:07.470 に答える