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

如何在对局双方rank分组不同时计算各文明的胜率

按Rank分组统计各文明胜率

需求背景

现有记录玩家对局的DataFrame(df),每行对应一局两名玩家的对战。需统计每个Rank分组下各文明的胜率,核心规则:

  • 获胜文明在自身所属的Rank分组中记1次胜利
  • 失败文明在自身所属的Rank分组中记1次失败
  • 同一对局中两名玩家的Rank分组可能不同,需分别归属到各自分组统计

示例数据

df的前10行数据如下:

# 数据结构预览
str(df)
#> 'data.frame':	10 obs. of  5 variables:
#>  $ p1.civ        : chr  "english" "english" "french" "rus" ...
#>  $ p1.rank.group : chr  "diamond" "silver" "gold" "gold" ...
#>  $ p2.civ        : chr  "rus" "holy_roman_empire" "rus" "mongols" ...
#>  $ p2.rank.group : chr  "platinum" "platinum" "gold" "platinum" ...
#>  $ civ.won       : chr  "rus" "holy_roman_empire" "rus" "mongols" ...

# 表格形式展示
df
#>              p1.civ p1.rank.group       p2.civ p2.rank.group         civ.won
#> 1            english       diamond               rus      platinum               rus
#> 2            english        silver holy_roman_empire      platinum holy_roman_empire
#> 3             french          gold               rus          gold               rus
#> 4                rus          gold           mongols      platinum           mongols
#> 5            english      platinum holy_roman_empire      platinum           english
#> 6             french     conqueror           english     conqueror           english
#> 7            mongols          gold           english      platinum           english
#> 8  holy_roman_empire      platinum           chinese      platinum           chinese
#> 9    abbasid_dynasty     conqueror           english     conqueror           english
#> 10   abbasid_dynasty      platinum           mongols      platinum           mongols

解决方案代码

使用tidyverse工具链实现需求,核心步骤为拆分胜负记录、合并统计、计算胜率:

library(tidyverse)

# 生成胜利方记录:对应Rank组+获胜文明+1胜0负
win_records <- df %>%
  mutate(
    rank_group = case_when(civ.won == p1.civ ~ p1.rank.group, TRUE ~ p2.rank.group),
    civilization = civ.won,
    wins = 1,
    losses = 0
  ) %>%
  select(rank_group, civilization, wins, losses)

# 生成失败方记录:对应Rank组+失败文明+0胜1负
loss_records <- df %>%
  mutate(
    rank_group = case_when(civ.won == p1.civ ~ p2.rank.group, TRUE ~ p1.rank.group),
    civilization = case_when(civ.won == p1.civ ~ p2.civ, TRUE ~ p1.civ),
    wins = 0,
    losses = 1
  ) %>%
  select(rank_group, civilization, wins, losses)

# 合并记录并计算胜率
result <- bind_rows(win_records, loss_records) %>%
  group_by(rank_group, civilization) %>%
  summarise(
    total_wins = sum(wins),
    total_games = sum(wins + losses),
    .groups = "drop"
  ) %>%
  mutate(winrate = ifelse(total_games == 0, "0%", sprintf("%.2f%%", (total_wins / total_games) * 100))) %>%
  arrange(rank_group, civilization) %>%
  select(rank_group, civilization, winrate)

最终输出

运行代码后得到符合预期的结果:

rank_group civilization       winrate
1   conqueror abbasid_dynasty     0.00%
2   conqueror english             100.00%
3   conqueror french              0.00%
4     diamond english             0.00%
5        gold french              0.00%
6        gold mongols             0.00%
7        gold rus                 50.00%
8    platinum abbasid_dynasty     0.00%
9    platinum chinese             100.00%
10   platinum english             50.00%
11   platinum holy_roman_empire   33.33%
12   platinum mongols             100.00%
13   platinum rus                 100.00%
14     silver english             0.00%

内容的提问来源于stack exchange,提问作者Rayby

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 03:53:11