如何在对局双方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
相关产品推荐
相关产品推荐

