2

このサイトの人々の助けを借りて、これにy似た (ただし、はるかに単純化された) マトリックスがあります。

1,3
1,3
1,3
7,1
8,2
8,2

乱数を生成する 3 番目の列を作成しました (このコードj=cbind(y,sample(1:99999,y[,2],replace=FALSE)).

マトリックスjは次のようになります。

1,3,4520
1,3,7980
1,3,950
7,1,2
8,3,4520
8,3,7980
8,3,950

3 番目の列の真の乱数を取得するには、3、次に 1、次に 2 という繰り返し行のそれぞれについて、その繰り返し部分内で複製されない乱数を取得するようにするにはどうすればよいですか ( replace = FALSE)?

4

3 に答える 3

5

これが発生する理由:

問題は、sampleコマンド構造が次のとおりであるということです。

sample(vector of values, how many?, replace = FALSE or TRUE)

ここで、「いくつ?」ONE値であると想定されています。の2番目の列全体を指定するためy、最初の値を選択するだけで、次の3ようになります。

set.seed(45) # just for reproducibility
sample(1:99999, 3, replace = F)

そして、このシードの値は次のとおりです。

# [1] 63337 31754 24092

また、値は3つしかないため、6行のマトリックスにバインドしているため、値が「リサイクル」されます(つまり、同じ順序で値が繰り返されます)。だから、あなたは得る:

#      [,1] [,2]  [,3]
# [1,]    1    3 63337
# [2,]    1    3 31754
# [3,]    1    3 24092
# [4,]    7    1 63337
# [5,]    8    2 31754
# [6,]    8    2 24092

値が繰り返されることを確認してください。あなたが示したマトリックスについては、私はどのように7,1,2発生するのか分かりません。の行列の最初の値としてy[,2] = 3

代わりにすべきこと:

y <- cbind(y, sample(1:99999, nrow(y), replace = FALSE))

これは、 (ここで)置換せずに値sampleを生成するように要求します。nrow(y) = 6これにより、長さ6の同一でない値が生成され、マトリックスにバインドされますy

于 2013-03-01T17:32:52.733 に答える
1

これにより、必要なものが得られるはずです。

j <- cbind(y, unlist(sapply(unique(y[,2]), function(n) sample(1:99999, n))))

編集: コードにエラーがありました。機能uniqueはもちろん必要です。

于 2013-03-01T18:41:36.280 に答える
1

ループなしではこれを取得できません。たぶん、他の誰かがよりエレガントなソリューションを手に入れることができます。私にとって問題は、グループ内で繰り返し、グループ間で繰り返しなしでサンプリングすることです

ll <- split(dat, paste(dat$V1,dat$V2,sep=''))
ll.length <- by(dat, paste(dat$V1,dat$V2,sep=''),nrow)
z <- rep(0,nrow(dat))  

SET <- seq(1,100)  ## we can change 100 by 99999 for example
v =1
for (i in seq_along(ll)){
  SET <- SET[is.na(match(z,SET))]
  nn   <- nrow(ll[[i]]) 
  z[v:(v+nn-1)] <- sample(SET,nn,rep=TRUE) 
  v <- v+nn
}

 z
[1]  35  77  94 100  23  59
于 2013-03-01T19:09:13.157 に答える