基于概率矩阵按对应行不同样本量从目标矩阵抽样的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
相关产品推荐
相关产品推荐

