如何从牌组抽5张牌并统计四条出现次数?R代码求助
统计抽牌中四条(Four of a Kind)的出现次数
问题背景
你已经完成了10000次5张牌的抽样,现在需要统计其中出现四条(即某一牌面恰好出现4次)的行数。
解决方案
下面提供两种实现方式,分别基于Base R和Tidyverse工具集:
方法1:Base R 实现
直接对数据框的每一行计算牌面出现的频率,判断是否存在频率为4的情况:
# 确保df是正确的基础数据框 df <- data.frame(output) # 定义函数检查单行是否为四条 is_four_of_a_kind <- function(row) { freq <- table(row) any(freq == 4) } # 统计符合条件的行数 four_of_a_kind_count <- sum(apply(df, 1, is_four_of_a_kind)) # 输出结果 cat("四条出现的次数:", four_of_a_kind_count, "\n")
方法2:Tidyverse 实现
如果你习惯用tidyverse语法,可按以下方式处理:
# 先安装并加载tidyverse包(首次使用需运行install.packages("tidyverse")) library(tidyverse) # 将抽样矩阵转为tibble格式 df <- as_tibble(output) # 按行统计牌面频率,筛选并计数四条的行数 four_of_a_kind_count <- df %>% rowwise() %>% mutate(freq_list = list(table(c_across(everything())))) %>% filter(any(freq_list == 4)) %>% nrow() # 输出结果 print(four_of_a_kind_count)
额外优化建议
你当前的numbers2向量中每个牌面重复了5次(比如Ace出现5次),但真实一副牌里每个牌面仅对应4种花色。若要模拟真实牌局,建议修正牌组定义:
# 标准13种牌面 numbers <- c("Ace", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Jack", "Queen", "King") # 生成52张标准牌组(每个牌面4张) numbers2 <- rep(numbers, times = 4)
这样抽样时不会出现同一牌面超过4张的情况,更贴合实际场景。
内容的提问来源于stack exchange,提问作者EAG
相关产品推荐
相关产品推荐

