【问题标题】:Distribute a sum randomly across columns跨列随机分配总和
【发布时间】:2020-06-25 21:57:44
【问题描述】:

假设我有一个长度为n 的向量。假设n=3 所以向量是v=c(3,5,4)

我有一个包含n 行和m 列的零矩阵。假设m=5

mymatrix <- matrix(rep(0, 3*5), nrow=3)

我想要将v 的值随机分布在每一行的列中。所以在这个例子中,第一行的总和为 3,第二行的总和为 5,第三行的总和为 4。这将是一种可能的随机分配:

0   1   2   0   0
3   1   0   0   1
0   2   2   0   0

行的总和为 3,5,4,即v 的值。

我怎样才能做到这一点?我的想法是从

sapply(v, function(i){sample(1:m, i, replace=TRUE)})

然后从那里开始,但这给了我一个列表,因为每个结果的长度不同,我不确定如何从那里开始。

编辑:目的不是负数,因此 0 9 1 1 -8 总和为 3 将不是有效行。

【问题讨论】:

    标签: r


    【解决方案1】:

    使用purrr

    library(tibble)
    library(dplyr)
    library(purrr)
    
    n <- 3
    m <- 5
    v <- c(3,5,4)
    y <- sapply(v, function(i){sample(1:m, i, replace=TRUE)})
    
    do_it <- function(x) {
      tmp <- tibble(
        index = x,
        cnt = 1
      ) %>% 
        group_by(index) %>% 
        summarise(cnt = sum(cnt))
      out <- rep(0, m)
      out[tmp$index] <- tmp$cnt
      return(out)
    }
    
    y %>%
      map(~do_it(.x)) %>% 
      unlist() %>% 
      matrix(nrow = 3, byrow = TRUE)
    

    【讨论】:

      【解决方案2】:

      也许 parts 来自包 partitions 是您实现目标所需的工具,即,

      library(partitions)
      # define your custom function `f` to generate random combinations and positions, with row sum subject to the given value 
      f <- function(k) replace(rep(0,ncol(mymatrix)),
                               sample(ncol(mymatrix),k),
                               as.data.frame.matrix(parts(k))[sample(k),sample(k,1)])
      

      这样

      set.seed(1)
      M <- t(sapply(v, f))
      > M
           [,1] [,2] [,3] [,4] [,5]
      [1,]    0    0    3    0    0
      [2,]    1    0    0    4    0
      [3,]    0    4    0    0    0
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-03
        • 1970-01-01
        • 1970-01-01
        • 2020-10-30
        • 2012-03-30
        相关资源
        最近更新 更多