【问题标题】:Sampling loop from vector从向量中采样循环
【发布时间】:2011-11-10 22:21:58
【问题描述】:

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

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)

【问题讨论】:

    标签: r sampling


    【解决方案1】:

    这是你想要的吗?

    > 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
    

    【讨论】:

    • 实际上是 John (The OP) 补充说的。我只是对其进行了调整,否则建议的编辑可能会被拒绝。
    【解决方案2】:

    您只需拨打mapply 即可完成此操作。您只需要一个对象,该对象包含您的 bcap 对象的 cumsum 调用中的内容。

    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
    

    【讨论】:

      【解决方案3】:
      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
      

      【讨论】:

      • 谢谢,出于某种原因 - 我收到以下错误:do.call(flat, c(args, list(...))) 中的错误:'what' must be a string或函数,您可以在下面的回复中测试示例..
      • @John:你可以使用过时版本的 R 和/或 plyr 吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-25
      • 1970-01-01
      • 1970-01-01
      • 2014-06-02
      • 2017-12-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多