2

セル内の頻度に比例して、分割表からサンプリングする関数を作成する際に、以下のコードまで管理しました。

その後expand.gridtable元のサイズ テーブルに戻ります。サンプルサイズが十分に大きく、一部のカテゴリが完全に欠落していない限り、これはうまく機能します。それ以外の場合、tableコマンドは元のテーブルよりも次元が小さいテーブルを返します。

FunSample<- function(Full, n) {
  Frame <- expand.grid(lapply(dim(Full), seq))
  table(Frame[sample(1:nrow(Frame), n, prob = Full, replace = TRUE), ])
}
Full<-array(c(1,2,3,4), dim=c(2,2,2))
FunSample(Full, 100) # OK
FunSample(Full, 1) # not OK, I want it to still have dim=c(2,2,2)!

私の脳は機能を停止しました。元に戻すには少し微調整する必要があることはわかっています!?

4

3 に答える 3

3

クロス集計も多項分布であるためrmultinom、出力の次元を使用およびリセットできます。これにより、パフォーマンスが大幅に向上し、維持する必要のあるコードが削減されます。

> X <- rmultinom(1, 500, Full)
> dim(X) <- dim(Full)
> X
, , 1

     [,1] [,2]
[1,]   18   92
[2,]   45   92

, , 2

     [,1] [,2]
[1,]   28   72
[2,]   49  104

> X2 <-rmultinom(1, 4, Full)
> dim(X2) <- dim(Full)
> X2
, , 1

     [,1] [,2]
[1,]    0    1
[2,]    0    0

, , 2

     [,1] [,2]
[1,]    0    1
[2,]    1    1
于 2015-05-19T18:37:16.640 に答える
3

table()欠落している組み合わせを「削除」したくない場合は、列を強制Frame的に因子にする必要があります。

FunSample <- function(Full, n) {
  Frame <- as.data.frame( lapply( expand.grid(lapply(dim(Full), seq)), factor) )  
  table( Frame[sample(1:nrow(Frame), n, prob = Full, replace = TRUE), ])
}   

> dim( FunSample(Full, 1))
[1] 2 2 2
> dim( FunSample(Full, 100))
[1] 2 2 2
于 2011-06-16T19:16:37.880 に答える
1

;tabulateの代わりに使用できます。tableここにあるように、整数値のベクトルで機能します。array元のデータを作成したときと同じように、直接を使用して出力を配列に取得することもできます。

FunSample<- function(Full, n) {
  samp <- sample(1:length(Full), n, prob = Full, replace = TRUE)
  array(tabulate(samp), dim=dim(Full))
}
于 2011-06-16T19:30:27.000 に答える