从矢量采样循环

时间:2011-11-10 22:21:59

标签: r sampling

我正在开发一个采样函数来进行随机化以简化日子:

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)

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

library("plyr")

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

创建一个data.frame,其中包含from / to的每个范围,使用它来创建包含序列的列表,对每个列表进行采样,然后将它们组合在一起。

更新:

为我工作:

> 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

答案 2 :(得分: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