6

私は正と負の数のベクトルを持っています

vec<-c(seq(-100,-1), rep(0,20), seq(1,100))

ベクトルは例よりも大きく、ランダムな値のセットを取ります。ベクトル内の負の数を繰り返し見つける必要があります...これは非常に非効率的です。

負の数だけを見つける必要があり、ベクトルは並べ替えられているため、最初の 0 または正の数のインデックスのみを知る必要があります (実際のランダム ベクトルには 0 がない場合があります)。

現在、このコードを使用して長さを見つけています

length(which(vec<0))

しかし、これは R がベクトル全体を通過することを強制しますが、それはソートされているので、その必要はありません。

私は使用できます

match(0, vec)

しかし、私のベクトルには常に0があるとは限りません

だから私の質問は、match()特定の値を見つける代わりに条件を適用する関数はありますか? which()または、コードを実行するためのより効率的な方法はありますか?

4

3 に答える 3

3

使用sum()と論理比較:

sum( vec < 0 )
[1] 100

これは非常に迅速で、論理を合計すると、TRUE1 とFALSE0 になるため、合計は負の値の数になります。

うーん、ベンチマーク比較の必要性を感じます... :-) ベクトルの長さは 2e5 です

library(microbenchmark)
vec<-c(seq(-100,-1,length.out=1e5), rep(0,20), seq(1,100,length.out=1e5))
microbenchmark( (which.min(vec < 0) - 1L) , (sum( vec < 0 )) )

Unit: milliseconds
                      expr      min       lq   median       uq       max neval
 (which.min(vec < 0) - 1L) 1.883847 2.130746 2.554725 3.141787 75.943911   100
            (sum(vec < 0)) 1.398100 1.500639 1.508688 1.745088  2.662164   100
于 2013-04-25T11:06:20.130 に答える