You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 01:31:03