如何在矩阵中将0保持为0

时间:2015-12-01 11:36:30

标签: r loops if-statement matrix

我使用以下代码生成矩阵

randomdiv <-
  function(nchrom, ndivs, size) {
    sz <- matrix(nrow = nchrom, ncol = ndivs)
    for (j in 1:nchrom) {
      n <- size
      for (i in 1:ndivs)
      {
        old_subs <- rbinom (1, n, 0.5)
        num_chrom <- rep(1 / nchrom, nchrom)
        new_subs <- rmultinom(1, size * nchrom / 2, prob = c(num_chrom))
        m <- old_subs + new_subs
        sz[j,i] <- m[1,1]
        n <- m
      }
    }
    return (sz)
  }

>randomdiv(3, 3, 10)
      [,1] [,2] [,3]
  [1,]   11   13   12
  [2,]    6    8    5
  [3,]   12   11    9

我需要做的唯一调整是,当rbinom函数在列中生成0时,我需要将该出现保持为矩阵的其余部分的0,但是任何{{1需要经过循环的其余部分并添加>0

我试过了;

new_subs

我已尝试使用randomdiv <- function(nchrom, ndivs, size) {sz <- matrix(nrow = nchrom, ncol = ndivs) for (j in 1:nchrom) { n <- size for (i in 1:ndivs) { old_subs <- rbinom (1, n, 0.5) num_chrom <- rep(1/nchrom, nchrom) new_subs <- rmultinom(1, size*nchrom/2, prob = c(num_chrom)) m <- ifelse(old_subs>0, old_subs + new_subs, old_subs+0) sz[j,i] <- m[1,1] n <- m } } return (replicate(ncell, sz, simplify = FALSE)) } > randomdiv(3, 3, 10) #Error in m[1, 1] : incorrect number of dimensions 函数进行一些不同的策略,但我认为它只将列视为一个整体,因此如果有一个0,则整个列都没有任何反应,而我需要对列中的每个值进行单独处理。

1 个答案:

答案 0 :(得分:1)

您只需将if()else一起使用,如果有0,则跳过几行代码:

randomdiv <-
  function(nchrom, ndivs, size) {
    sz <- matrix(nrow = nchrom, ncol = ndivs)
    for (j in 1:nchrom) {
      n <- size
      for (i in 1:ndivs)
      {
        old_subs <- rbinom (1, n, 0.5)
        if(old_subs>0){
          num_chrom <- rep(1 / nchrom, nchrom)
          new_subs <- rmultinom(1, size * nchrom / 2, prob = c(num_chrom))
          m <- old_subs + new_subs
          sz[j,i] <- m[1,1]
        } else sz[j,i] <- old_subs
        n <- m
      }
    }
    return (sz)
  }

randomdiv(3, 3, 2)
#      [,1] [,2] [,3]
# [1,]    2    2    0
# [2,]    1    2    4
# [3,]    1    1    0