如何在R语言中生成每行和为100的随机百分比矩阵?
在R中生成每行和为100的非负整数矩阵
方法1:用rmultinom直接生成(推荐)
这是最简洁高效的方式,直接生成符合要求的矩阵,所有元素都是非负整数,且每行和严格为100:
set.seed(42) # 生成100行、11列的矩阵,每行和为100 ranMat <- t(rmultinom(n = 100, size = 100, prob = rep(1/11, 11)))
- 参数说明:
n = 100:生成100组样本(对应矩阵的100行)size = 100:每组样本的总和为100prob = rep(1/11, 11):每个列的概率权重相等,保证各列数值分布均匀;如果需要某几列数值偏大/偏小,可调整权重(比如prob = c(0.2, rep(0.8/10, 10))让第一列权重更高)
- 验证行和:执行
rowSums(ranMat),结果全为100
方法2:基于已有随机矩阵调整
如果你想保留原始sample(0:100)生成的数值分布特征,可以先生成随机矩阵,再归一化调整到每行和为100:
set.seed(42) # 先生成100行11列的原始随机矩阵 ranMat <- matrix(sample(0:100, 1100, replace = TRUE), ncol = 11) # 归一化并调整到和为100 row_sums <- rowSums(ranMat) # 先按比例缩放后取整 ranMat_scaled <- floor(ranMat / row_sums * 100) # 计算每行与100的差值 diff <- 100 - rowSums(ranMat_scaled) # 随机给每行的diff个元素加1,补全到100 for (i in 1:nrow(ranMat_scaled)) { if (diff[i] > 0) { ranMat_scaled[i, sample(1:11, diff[i])] <- ranMat_scaled[i, sample(1:11, diff[i])] + 1 } }
- 验证行和:执行
rowSums(ranMat_scaled),结果全为100 - 这种方法保留了原始随机数的波动特征,适合需要贴近真实数据分布的场景
内容的提问来源于stack exchange,提问作者The_Tams
相关产品推荐
相关产品推荐

