2016-04-04 3 views
0

iterpcを使用してイテレータを作成し、iterators :: iterパッケージでラップしました。r - イテレータとiterpcパッケージを使用します。イテレータのサブセットを作成できますか?

iter<-iterpc(nrow(data),4,ordered=TRUE,replace=TRUE) 
it<-iter_wrapper(iter) 

私は、foreachの

calcs<-foreach(i=it)%dopar%{ 
    blah} 

を使用して計算を行う私の問題は、私はイテレータ内のすべての要素を使用したくないということです。イテレータの特定の要素、たとえば1000個を無作為に選択したいと思います。 (計算時間は問題です) イテレータのランダムなサブセットを選択するにはどうすればよいですか?

+0

私はiterpcの著者です。組込みの 'iterators'をサポートしている新しいパッケージhttps://cran.r-project.org/web/packages/arrangements/index.htmlを使いたいかもしれません。 –

答えて

1

私は、順列イテレータが連続して動作すると思うので、ランダムにサンプリングする方法はありません。あなたが行うことができるのは、間接的に親イテレータにnextElemを呼び出して、間引きされたバージョンを返すイテレータを作成することです。この例では、いくつかの「薄い」パラメータを経由して、イテレータの薄くなったバージョンを作成します。

> thinit = function(iterator,thin){ 
    iter(
     function(){ 
      for(i in 1:(thin-1)){ 
       nextElem(iterator) 
      } 
      nextElem(iterator)} 
     ) 
    } 

注意を最後の呼び出しはイテレータの戻り値となるように、私はループでthin-1回それを呼び出します。したがって

、単純な1から始まる:100イテレータ:

> i1 <- iter(1:100) 

間引きバージョン作る:

> i10 = thinit(i1, 10) 

を、ループ出力を薄くする:

> foreach(i=i10) %dopar% {i} 
[[1]] 
[1] 10 

[[2]] 
[1] 20 

[[3]] 
[1] 30 

等今、あなたはラッパー呼び出しnextElemを乱数にすることができます(それがを返す限りを呼び出すと、イテレータとして機能します)、親イテレータからランダムなサンプルを取得します。 を正確にの250個のサンプルを順列から得ることはできませんが、2500個の置換があり、nextElemrunif(1)>.9まで呼び出すと、平均250を取得します。このように:

親イテレータはビッグN回呼ばれますが、サンプリングは私がどこである疑いがあるだけ少ない回数と呼ばれる {i}であなたのループの肉を、意味している。なお
> pthin = function(iterator, p){ 
    iter(
    function(){ 
     while(runif(1)<p){ 
     nextElem(iterator) 
     } 
     nextElem(iterator) 
     } 
    ) 
    } 
> i1 <- iter(1:100) 
> ip10 = pthin(i1,.9) 
> unlist(foreach(i=ip10) %dopar% {i}) 
[1] 1 9 18 19 22 28 35 38 53 55 63 67 81 84 86 89 95 98 
> i1 <- iter(1:100) 
> ip10 = pthin(i1,.9) 
> unlist(foreach(i=ip10) %dopar% {i}) 
[1] 15 19 21 24 45 59 63 70 73 76 79 88 94 100 
> i1 <- iter(1:100) 
> ip10 = pthin(i1,.9) 
> unlist(foreach(i=ip10) %dopar% {i}) 
[1] 10 50 62 76 79 81 97 

のほとんど時間が費やされます。

親イテレータから与えられたN個のサンプルを本当に主張していて、イテレータの要素の数を知っている場合は、それからNのサンプルを計算し、上記のようにイテレータラッパーを使用して、親にnextElemあなたのサンプルの次のインデックスに到達するまで、それを返します。私の例のように、クロージャで返されるサンプルの状態を保持する必要があります。

元のイテレーターの値を1からNまでの連続したインデックス番号と共に生成するイテレーターを戻すイテレーター・ラッパーを作成します(この場合、より多くのコーヒーが必要です)。これはpython zipのようなものです。その後、インデックス番号がサブセット内にある反復でのみ作業します。元のイテレータの長さは、サブセットを生成することがわかっている必要があります。例:

これは私のzipイテレータラッパーです。あなたが望むよう

> zipit = function(iz){ 
    itn=1 
    iter(
     function(){ 
      itn<<-itn+1 
      list(index=itn-1,value=nextElem(iz)) 
      } 
     ) 
    } 

今すぐ順列イテレータを作成します。それは$indexが連続指数であり、$valueが親イテレータからの値であり、リストの要素を生成し、イテレータを返します。私たちは、この1つは、合計で10個の要素を持って知っているので、10から4つの値のサンプルを生成します。

> I <- iterpc(5, 2) 
> it <- iter_wrapper(I) 
> subset = sample(10,4) 

今、あなたのメインループは(この場合、値の単純合計)テストとプロセスだけそれらの反復を持っていますサブセット:

> foreach(i=zipit(it), .combine=c) %do% {if(i$index %in% subset)sum(i$value)} 
[1] 4 7 8 9 
関連する問題