1

私は、日々を楽にするためにランダム化を行うためのサンプリング関数を開発するために遊んでいます:

Question: 
    pln <- 1:80
    bcap <- cumsum(c(20, 12, 16, 16, 16))
    bcap
    [1] 20 32 48 64 80

plnこの例では、1:20、21:32、33:48、49:64、65:80 のようにランダム化します。これは、シナリオによって異なる場合があります。

newpln <- c(sample(1:20), sample(21:32), sample(33:48), 
 sample(49:64), sample(65:80))

bcap長さを任意の数にすることができる一般的な関数を作成したいのですが、pln実行する必要があります1: max(bcap)

4

3 に答える 3

2

これは、あなたの望むことですか?

> unlist(sapply(mapply(seq, c(1, bcap[1:(length(bcap)-1)]+1), bcap), sample))
 [1] 13 19  4 16 11  2  5 20  9 14 10  3  1  7  6  8 17 12 15 18 27 24 30 32 23 25 28 21 31 26 29 22 39 41 48 36 37 45 42 47 43 38 40 34 35
[46] 44 46 33 60 52 50 58 51 54 62 55 64 61 59 49 63 53 56 57 72 74 76 78 67 69 70 66 73 79 68 80 77 71 75 65

テスト:

> pln <- 1:12
> pln
 [1]  1  2  3  4  5  6  7  8  9 10 11 12

> bcap <- cumsum(c(4, 3, 2, 3))
> bcap
[1]  4  7  9 12

> unlist(sapply(mapply(seq, c(1, bcap[1:(length(bcap)-1)]+1), bcap), sample))
 [1]  4  2  3  1  6  5  7  8  9 12 11 10
> unlist(sapply(mapply(seq, c(1, bcap[1:(length(bcap)-1)]+1), bcap), sample))
 [1]  4  2  3  1  6  5  7  9  8 10 12 11
> unlist(sapply(mapply(seq, c(1, bcap[1:(length(bcap)-1)]+1), bcap), sample))
 [1]  2  3  1  4  7  6  5  8  9 11 10 12
于 2011-11-10T22:40:38.773 に答える
0

これは、 を 1 回呼び出すだけで実行できますmapplycumsumオブジェクトの呼び出しの中にあるものを含むオブジェクトが必要なだけですbcap

bvec <- c(20, 12, 16, 16, 16)
mapply(function(x,y) sample(x)+y-x, bvec, cumsum(bvec))

小さな例:

bvec <- c(2,1,3,1)
set.seed(21)
unlist(mapply(function(x,y) sample(x)+y-x, bvec, cumsum(bvec)))
# [1] 2 1 3 4 5 6 7
于 2011-11-11T00:16:01.383 に答える
0
library("plyr")

unlist(
  llply(
    mlply(
      data.frame(from=c(1,bcap[-length(bcap)]), to=bcap), 
      seq),
    sample),
  use.names = FALSE)

from/to の各範囲で data.frame を作成し、それを使用してシーケンスのリストを作成し、各リストをサンプリングしてから、それらを結合します。

アップデート:

私のために働いた:

> library("plyr")
> bcap <- cumsum(c(4, 3, 2, 3))
> unlist(llply(mlply(data.frame(from=c(1,bcap[-length(bcap)]), to=bcap),seq),sample),use.names=FALSE)
 [1]  4  2  3  1  7  4  5  6  9  7  8 12  9 11 10
> unlist(llply(mlply(data.frame(from=c(1,bcap[-length(bcap)]), to=bcap),seq),sample),use.names=FALSE)
 [1]  3  1  2  4  5  6  4  7  9  7  8  9 12 10 11
> unlist(llply(mlply(data.frame(from=c(1,bcap[-length(bcap)]), to=bcap),seq),sample),use.names=FALSE)
 [1]  2  3  4  1  6  5  4  7  8  9  7 11 10 12  9
于 2011-11-10T22:43:15.070 に答える