3

次の並べ替えられたベクトルがあります。

> v
 [1] -1  0  1  2  4  5  2  3  4  5  7  8  5  6  7  8 10 11

ユーザーループまたは言語キーワードを使用して暗黙的にvector 全体をループせずに -1、0、および 11 エントリを削除するにはどうすればよいですか? つまり、並べ替えられたシーケンスが最小、最大パラメーター 1 と 10 の範囲内になるように、各エッジと各エッジでのみベクトルをトリミングしたいのです。解決策では、すべての要素をチェックすることを避けるために、ベクトルが並べ替えられていると想定する必要があります。

この種のソリューションは、ベクトル内のアイテムを別のオブジェクトのインデックスとして使用する場合に、非常に大きなベクトルのベクトル化操作で便利です。1 つのアプリケーションについては、このスレッドを参照してください。

4

4 に答える 4

10

インデックスによってベクトルに要素を含めるには:

v [2:10]

特定の要素を除外する

v [-c (1, 11) ]

特定の範囲のみを含めるには:

v <- v [v>=1 & v <=10]

あなたの例のように、トリミングされる要素の数<<ベクトル内の要素の数であると仮定することが許されている場合、二分探索を打ち負かすことができると思います:

> n<-1e8
> v<--3:(n+3)
> 
> min <- 1
> max <- length(v)
> 
> calcMin <- function(v, minVal){
+   while(v[min] < minVal){
+       min <- min + 1
+   }
+   min
+ }
> 
> calcMax <- function(v, maxVal){
+   while(v[max] > maxVal){
+       max <- max - 1
+   }
+   max
+ }
> 
> #Compute the min and max indices and create a sequence
> system.time(a <- v[calcMin(v, 1):calcMax(v,n)])
   user  system elapsed 
  1.030   0.269   1.298 
> 
> #do a binary search to find the elements (as suggested by @nograpes)
> system.time(b <- v[do.call(seq,as.list(findInterval(c(1,n),v)))])
   user  system elapsed 
  2.208   0.631   2.842 
> 
> #use negative indexing to remove elements
> system.time(c <- v[-c(1:(calcMin(v, 1)-1), (calcMax(v,n)+1):length(v))])
   user  system elapsed 
  1.449   0.256   1.704 
> 
> #use head and tail to trim the vector
> system.time(d <- tail(head(v, n=(calcMax(v,n)-length(v))), n=-calcMin(v, 1)+1))
   user  system elapsed 
  2.994   0.877   3.871 
> 
> identical(a, b)
[1] TRUE
> identical(a, c)
[1] TRUE
> identical(a, d)
[1] TRUE
于 2013-04-25T16:56:59.647 に答える
5

それを行うには多くの方法があります。

> v <- -1:11 # creating your vector
> v[v %in% 1:10]
 [1]  1  2  3  4  5  6  7  8  9 10
> setdiff(v, c(-1,0,11))
 [1]  1  2  3  4  5  6  7  8  9 10
> intersect(v, 1:10)
 [1]  1  2  3  4  5  6  7  8  9 10

さらに2つのオプションがありますが、それほどエレガントではありません。

> na.omit(match(v, 1:10))
> na.exclude(match(v, 1:10))
于 2013-04-25T16:57:42.863 に答える
2

も使用できます%in%

 vv <- c(-1,  0  ,1  ,2  ,4  ,5,  2  ,3  ,4,  5,  7  ,8,  5,  6,  7,  8, 10, 11)
 vv[vv %in% 1:10]

 [1]  1  2  4  5  2  3  4  5  7  8  5  6  7  8 10
于 2013-04-25T16:58:01.953 に答える