R语言采样问题:如何生成100×5指定概率分布数据集
修正R代码实现100×5数据集的正确采样
你的问题我太熟悉啦——原来的代码里Epsilon只被采样了一次,导致同一列里所有非2的数值都是同一个固定值,完全不符合每次独立采样的要求对吧?下面给你两种实用的修正方案:
方案一:逐元素独立判断(直观易懂)
这种方式对每个元素单独执行取值逻辑,确保每次选10+Epsilon时都重新采样Epsilon:
data.frame(sapply(1:5, function(x) { sapply(1:100, function(y) { # 用0-1的随机数判断概率,0.6的概率取2,否则取10+随机Epsilon ifelse(runif(1) < 0.6, 2, 10 + sample(-2:2, 1)) }) }))
方案二:向量化操作(更高效)
利用R的向量化特性批量处理,比逐元素循环速度快得多,适合生成大规模数据集:
data.frame(sapply(1:5, function(x) { # 生成100个布尔值:0.6概率为TRUE(对应取2) take_two <- runif(100) < 0.6 # 提前生成100个独立的Epsilon值 eps <- sample(-2:2, 100, replace = TRUE) # 根据布尔值批量选择结果 ifelse(take_two, 2, 10 + eps) }))
为什么原来的代码出问题?
你原来的代码里,sample(c(2, 10 + sample(-2:2,1)), 100, prob=c(0.6, 0.4), replace=T)这部分,10 + sample(-2:2,1)在创建采样选项列表时就已经计算完成,得到一个固定数值(比如11),之后的100次采样只是在2和这个固定数值之间选,根本没有每次重新生成Epsilon。
内容的提问来源于stack exchange,提问作者YefR
相关产品推荐
相关产品推荐

