如何简化R语言中按抽样结果给对象赋值0/1的代码?
R代码简化方案
你的需求本质是单次多项分布抽样(每次仅抽中1个类别,抽中类标记为1,其余为0),原写法通过逐次if判断赋值冗余度高,可以用以下两种更简洁的方式实现:
方法1:基于逻辑向量自动转数值的特性简化
R中逻辑值TRUE在数值运算时会自动转为1,FALSE自动转为0,利用这个特性可以完全替代多段if判断:
# 定义候选对象和对应概率 obj_names <- c("a", "b", "c") prob_vec <- c(0.2, 0.3, 0.5) # 抽样后直接生成对应0/1向量 result <- as.integer(obj_names == sample(obj_names, 1, prob = prob_vec)) # 赋值给对应变量 a <- result[1] b <- result[2] c <- result[3]
如果后续需要新增候选对象,只需要修改obj_names和prob_vec两个向量即可,不需要新增额外的判断逻辑。
方法2:直接调用多项分布抽样函数(最贴合需求)
R内置的rmultinom()函数原生支持这类「固定总抽中数、按概率分配到多个类别」的抽样场景,size=1时正好返回你需要的单类为1、其余为0的结果:
# n=1 表示做1次抽样,size=1表示每次抽样总命中数为1 result <- rmultinom(n = 1, size = 1, prob = c(0.2, 0.3, 0.5)) # 赋值给对应变量 a <- result[1] b <- result[2] c <- result[3]
这种写法不需要做额外的相等判断,代码语义更清晰,执行效率也更高。
两种方法最终得到的a、b、c变量效果和你原代码完全一致,都满足按给定概率抽中一个对象赋值为1、其余为0的需求。
内容的提问来源于stack exchange,提问作者Xia.Song
相关产品推荐
相关产品推荐

