如何在R语言中存储100组规模为187的二项分布随机抽样结果?
解决从二项分布抽取100组样本并存储的R语言问题
嗨,我明白你现在的需求:要生成100组规模为187的二项分布随机样本,最终存成100列(每列187个观测值)的结构。你的现有代码已经能生成单组样本,只需要稍微调整,把生成逻辑包裹进循环里,再用矩阵来存储所有结果就行。
修改后的完整代码
# 先读取数据(这部分只需要执行一次) mdata <- read.csv("c:/germany/st_it.csv", header = TRUE) t <- read.csv("c:/germany/pt_new.csv", header = TRUE) t1 <- t$PRO s <- mdata$st s1 <- mdata$it q <- 0.9946289 # 初始化一个187行×100列的空矩阵,用来存放100组样本 results_matrix <- matrix(nrow = 187, ncol = 100) # 循环100次,每次生成一组样本并存入矩阵 for (k in 1:100) { # 每次循环重新生成随机的b值(保证每组样本独立) b <- numeric(nrow(mdata)) for (i in 1:(nrow(mdata))) { b[i] <- rbinom(1, s[i], q^(s1[i])) } # 生成当前组的sus序列 sus <- numeric(187) sus[1] <- b[1] for (j in 2:187) { # 用普通if-else替代ifelse,单元素判断更清晰 if (t1[j] == t1[j-1]) { sus[j] <- sus[j-1] } else { sus[j] <- b[j] } } # 将当前组的sus存入矩阵的第k列 results_matrix[, k] <- sus } # (可选)转成数据框并命名列,方便后续导出 results_df <- as.data.frame(results_matrix) colnames(results_df) <- paste0("sample_", 1:100) # (可选)导出到CSV文件 write.csv(results_df, "c:/germany/100_binomial_samples.csv", row.names = FALSE)
关键修改说明
- 用矩阵存储结果:提前创建好187行100列的矩阵,每一列对应一组抽样结果,避免每次生成样本后手动拼接的麻烦。
- 外层循环控制抽样次数:新增了
k从1到100的循环,把生成单组样本的逻辑完全包裹进去,确保每组样本都是独立生成的。 - 每次循环重新生成
b:因为rbinom是随机函数,每次执行都会产生新的随机值,所以把b的生成放在外层循环里,保证每组样本的b都是独立的,进而得到不同的sus序列。 - 替换
ifelse为if-else:这里是对单个元素做条件判断,普通的分支语句比向量化的ifelse更直观,也不容易出现意外的向量处理问题。
这样处理后,results_matrix就是你需要的187行100列的结构,每一列都是一组187个观测值的样本;如果转成数据框results_df,还能方便地导出成CSV文件或者进行后续分析。
内容的提问来源于stack exchange,提问作者Afroz




