R语言中如何无需unique函数抽取无重复且匹配频次概率的样本?
按号码出现频率加权抽取不重复彩票号码(R语言实现)
问题场景与代码
和朋友一起参与巴西彩票,已在R中定义每位朋友选号的变量:
pestana = c(04, 15, 29, 36, 54, 25, 07) carol = c(7, 22, 30, 35, 44, 51, 57) davi = c(8, 13, 21, 29, 37, 42, 55) valerio = c(30, 20, 33, 14, 7, 41, 54) victor = c(09, 11, 26, 33, 38, 52, 57)
之前的操作是把所有号码合并后用unique()去重,再随机抽取7个号码,但现在希望不用unique(),抽取7个无重复号码,同时让出现次数更多的号码(比如数字7出现了3次)拥有更高的被抽取概率,而非让所有去重后的号码概率一致。
实现方案
直接通过统计号码出现频率作为抽样权重,用sample()的参数实现加权无重复抽样,完全不需要unique():
# 合并所有朋友的号码成一个向量 all_numbers <- c(pestana, carol, davi, valerio, victor) # 统计每个号码的出现次数(自动完成去重+计数) freq_table <- table(all_numbers) # 提取去重后的号码列表和对应的出现次数(作为抽样权重) target_numbers <- as.numeric(names(freq_table)) weight_values <- as.numeric(freq_table) # 加权抽取7个不重复号码:prob指定权重,replace=FALSE确保无重复 sampled_result <- sample(target_numbers, size = 7, replace = FALSE, prob = weight_values) # 查看最终抽取结果 print(sampled_result)
原理说明
table(all_numbers)会自动统计每个号码的出现次数,相当于同时完成了去重和计数的操作,不需要额外调用unique()prob=weight_values让抽样概率和号码出现次数成正比:出现3次的号码,被抽中的概率是出现1次号码的3倍replace=FALSE保证最终抽取的7个号码完全不重复
内容的提问来源于stack exchange,提问作者Valério Souza Neto
相关产品推荐
相关产品推荐

