You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于概率矩阵按对应行不同样本量从目标矩阵抽样的R代码错误排查求助

问题排查与修正方案

咱先拆解下你代码里的核心问题:循环逻辑搞反了,而且变量被反复覆盖,导致最后只保留了第三行的抽样结果,这就是为啥输出全是600(Q第三行元素)的原因!

具体问题分析

你原来的代码外层循环遍历samplesize的每个值,内层又遍历1到3的行号。这意味着对于每个样本量i,你都把3行全跑了一遍,每次x循环都会重新给s赋值,最后s只会保留x=3时的抽样结果(也就是从Q第三行抽的样本),之前x=1、x=2的结果都被覆盖了,自然不符合你的预期。

修正后的代码

我们把循环顺序反过来,按行遍历,让每一行对应自己的样本量,同时避免变量被覆盖:

P=matrix(c(0.5,0.3,0.2,0.7,0.2,0.1,0,0.2,0.8),ncol=3,nrow=3,byrow=T)
Q=matrix(c(50,100,150,0,4,200,0,10,600),ncol=3,nrow=3,byrow=T)
samplesize=c(10,6,3)

# 按行遍历,每行对应专属的样本量
for(x in 1:3){
  # 获取当前行的概率向量
  p = P[x,]
  # 获取当前行对应的样本量
  current_sample_size = samplesize[x]
  # 执行抽样:从Q的第x行,用P第x行的概率,抽current_sample_size个样本
  s = sample(Q[x,], size = current_sample_size, prob = p, replace = TRUE)
  # 打印带行号的结果,方便区分
  cat(sprintf("第%d行的抽样结果:\n", x))
  print(s)
}

额外优化:保存结果到列表

如果你需要把所有抽样结果保存下来方便后续处理,可以用列表存储:

# 初始化空列表
sample_results <- list()

for(x in 1:3){
  p = P[x,]
  current_sample_size = samplesize[x]
  sample_results[[x]] = sample(Q[x,], size = current_sample_size, prob = p, replace = TRUE)
}

# 查看所有结果
sample_results

这样运行后,第一行的结果只会包含50、100、150,第二行只会有0、4、200,第三行是0、10、600,完全符合你的需求啦!

内容的提问来源于stack exchange,提问作者johnylulu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 22:02:32