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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:12:17