6

私は2つの数値ベクトルを持っています。1つは最大値を計算するための値を格納し、もう1つはローリングウィンドウの長さでローリングベースでそれらの最大値を計算します。以下はサンプルコードです。通常、system.time 内のコードを高速化しようとしています。同じことを行うための準備が整った関数またはベクトル化された方法はありますか?

a <- rep(1:5,20000)
set.seed(123)
b <- rep(sample(1:50),2000)

system.time({
out <- vector(mode='numeric', length=NROW(a))
for(i in seq(a)) {
  if (i-b[i]>=0) out[i] <- max(a[(i-b[i]+1):i])
  else out[i] <- NA
}
})
4

2 に答える 2

1

その一部をベクトル化することができました:

オリジナル -

system.time({
  out <- vector(mode='numeric', length=NROW(a))
  for(i in seq(a)) {
    if (i-b[i]>=0) out[i] <- max(a[(i-b[i]+1):i])
    else out[i] <- NA
  }
})
## user  system elapsed 
## 0.64    0.00    0.64 

わずかにベクトル化 -

system.time({
  nr <- NROW(a)
  out <- rep(NA,nr)
  m <- 1:nr - b + 1
  n <- (1:nr)[m>0]

  for(i in n)
    out[i] <- max(a[m[i]:i])
})
## user  system elapsed 
## 0.39    0.00    0.39 
于 2013-04-26T10:23:44.563 に答える
0

aこの問題の一部をベクトル化できます。特に、開始インデックス位置(私は this と呼びますstr) とウィンドウの終わり ( )を見つける必要がありますが、これらのインデックス位置をにend適用するには、ループ構造を使用する必要があります。使用してaください。そのようです:maxmapply

x <- seq_len( length(a) )
end <- which( x-b > 0 )
str <- end - b[end]
res <- a
res[ - end ] <- NA
res[end] <- mapply( function(x,y) max( a[ x:y ] ) , str , end )

@ e4e5f4 の回答と比較すると、次のようになります。

identical( res , out )
[1] TRUE

ただし、それほど高速ではありません。

user  system elapsed 
0.46    0.00    0.47

最後の操作をベクトル化する方法があれば、これは非常に高速ですが、現時点ではこれを行う方法は考えられません!

于 2013-04-26T13:12:26.657 に答える