1

我正在开发一个抽样函数来进行随机化以使日子更轻松:

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

对于这个例子,我想随机化pln1: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
library("plyr")

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

使用每个范围从/到创建一个 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 回答
0

你可以通过一个电话来做到这一点mapply。您只需要一个包含对象cumsum调用内部内容的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 回答