使用dplyr按行统计元素:数据格式转换与计数需求
用dplyr按行统计牌面出现次数的解决方案
这问题我熟,用dplyr配合tidyr就能轻松搞定,我给你一步步拆解,附完整可运行的代码示例:
1. 先构造模拟数据集(贴近你的场景)
首先我们先生成和你描述一致的模拟数据:5行(对应5手牌),每行10列(每手牌10张牌),牌面是1-13的随机数。为了后续分组方便,我们给每手牌加一个唯一标识hand_id:
library(dplyr) library(tidyr) # 用于格式转换的工具包 # 固定随机种子,保证结果可复现 set.seed(123) cards_data <- tibble( hand_id = 1:5, # 生成10列牌面数据 across(1:10, ~sample(1:13, size = 5, replace = TRUE)) )
2. 把宽格式数据转成长格式
dplyr的分组统计更适合处理长格式数据,所以我们先把每行的10张牌都放到同一列里:
long_cards <- cards_data %>% pivot_longer( cols = -hand_id, # 保留hand_id,其他列都转为值 names_to = "temp_col", # 原列名我们不需要,随便命名即可 values_to = "card" # 存储牌面数值的列名 )
3. 按行+牌面分组统计次数
现在我们可以按每手牌(hand_id)和牌面(card)分组,统计每个牌面在当前手牌中的出现次数:
card_counts <- long_cards %>% group_by(hand_id, card) %>% summarize(occurrences = n(), .groups = "drop")
4. 转回宽格式(可选,但更直观)
如果想要每个牌面作为单独一列,方便查看每手牌的完整统计结果,可以把数据转回宽格式,同时给没出现的牌面填充0:
final_result <- card_counts %>% pivot_wider( id_cols = hand_id, names_from = card, values_from = occurrences, names_prefix = "card_", # 给列名加前缀,比如card_1、card_2... values_fill = 0 # 没出现的牌面次数填0 )
针对原始矩阵的适配
如果你手里的原始数据是矩阵格式,只需要先转成tibble并添加hand_id即可:
# 假设原始数据是5×10的矩阵 cards_matrix <- matrix(sample(1:13, 5*10, replace = TRUE), nrow = 5) cards_data <- as_tibble(cards_matrix) %>% mutate(hand_id = 1:n())
这样处理后,final_result里的每一行就对应原来的一手牌,每个card_X列就是该牌面在这手牌中的出现次数啦。
内容的提问来源于stack exchange,提问作者Moose
相关产品推荐
相关产品推荐

