【问题标题】:Generate a random matrix in R with m columns and n rows where rows sum to 1在 R 中生成一个具有 m 列和 n 行的随机矩阵,其中行总和为 1
【发布时间】:2017-01-30 21:31:43
【问题描述】:

我想生成一个 nxm 矩阵。假设它是 100x3。我希望每一行总和为 1(所以两个“0”和一个“1”)。

sample(c(0,0,1),3) 

会给我 1 行,但有没有一种非常快速的方法可以在没有 rbind 的情况下生成整个矩阵?

谢谢!

【问题讨论】:

  • t(replicate(100,sample(c(0,0,1))))

标签: r


【解决方案1】:

没有循环,没有换位。只需创建一个零矩阵,并通过对行进行采样将每行的一个条目替换为 1。

m <- matrix(0, 100, 3)
nr <- nrow(m)
m[cbind(1:nr, sample(ncol(m), nr, TRUE))] <- 1

all(rowSums(m) == 1)
# [1] TRUE

【讨论】:

    【解决方案2】:
    mat <- matrix(runif(300),ncol=3)
    mat[] <- as.numeric(t(apply(mat, 1, function(r) r == max(r))))
    

    【讨论】:

    • 我认为问题需要 $0$ 或 $1$ 的离散值
    • 嗨,这不是我需要的。每行必须是两个 0 和一个 1。这是统一的。
    【解决方案3】:
     t(apply(t(matrix(rep(c(0,0,1),300),nrow = 3)), 1, function(x) sample(x)))
    

    【讨论】:

    • 不是我需要的。这会将所有的放在第 3 列中。
    【解决方案4】:

    由于您希望一行有一个 1,因此可以重述该问题以随机选择每行有 1 的列条目。

    所以你可以这样做,

    m <- 3; n<-100    
    rand_v <- floor(runif(n)*3)+1
    mat <- matrix(0,n,m)
    idx <- cbind(1:n,rand_v)
    mat[idx] <- 1
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2014-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-17
      相关资源
      最近更新 更多