0

私は次のものを持っています

cells = c(3, 5, 8, 6)
names(cells) = c('A', 'B', 'C', 'D')

セルの半分をランダムに選択し、新しいベクトル m1 に割り当てたいとします。セルの残りの半分は、m2 = セル - m1 に割り当てられます。私は R が初めてで、サンプル関数では、一度に個々のセルではなく、1 つのタイプのすべてのセルしか選択できないため、ここからどこに行けばよいかわかりません。

私のコードは現在このようになっています

y = ceiling(sum(cells)/2)


for(i in 1:y){

   z = sample(cells[cells>0], 1, replacement = FALSE, prob = NULL)

   if(z == cells[1]){
      cells[1] = cells[1] - 1
      m1[1] = m1[1] + 1
   }
   if(z == cells[2]){
      cells[2] = cells[2] - 1
      m1[2] = m1[2] + 1
   }
   if(z == cells[3]){
      cells[3] = cells[3] - 1
      m1[3] = m1[3] + 1
   } 
   if(z == cells[4]){
      cells[4] = cells[4] - 1
      m1[4] = m1[4] + 1
   }
}

各セルをランダムに選択するのではなく、セルタイプをランダムに選択するだけなので、これが間違っていることはわかっています。どんな助けでも大歓迎です。

4

3 に答える 3

-1

直接サンプリングする代わりにcells、インデックスをサンプリングし、それらを使用して要素を選択します。

cells = c(3, 5, 8, 6)
categories = c('A', 'B', 'C', 'D')

n  = length(cells)
cells_long = unlist(sapply(1:n
                          , function(i){ rep(categories[i],cells[i]) }
                          ))

n  = length(cells_long)
ix = sample(1:n, floor(n/2))
m1 = cells_long[ix]
m2 = cells_long[-ix]

これは、複雑なオブジェクトや関連オブジェクトのコレクションからのサンプリングにも役立つトリックです。

于 2013-07-16T17:12:38.377 に答える