在R中生成一个随机矩阵,其中m列和n行,其中行总和为1

时间:2017-01-30 21:31:44

标签: r

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

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

会给我一行但是有一种非常快速的方法来生成没有rbind的整个矩阵吗?

谢谢!

4 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:2)

mat <- matrix(runif(300),ncol=3)
mat[] <- as.numeric(t(apply(mat, 1, function(r) r == max(r))))

答案 2 :(得分:2)

 t(apply(t(matrix(rep(c(0,0,1),300),nrow = 3)), 1, function(x) sample(x)))

答案 3 :(得分:2)

由于您希望单行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

希望这有帮助。