如何用R结合purrr的map函数创建球员同场首发次数的data.frame
嘿,刚接触网络分析就想到用purrr来处理这个需求,思路很棒!我来一步步带你实现这个球员同场首发次数的统计,完全贴合你的需求~
步骤1:整理比赛数据
首先我们把所有比赛的首发名单整理成一个列表,这样用purrr的map函数处理起来会非常方便:
library(purrr) library(dplyr) # 你的输入比赛数据 game_1 <- c("Andy","Bob","Chris","Doug","Evan") game_2 <- c("Andy","Chris","Evan","Fred","George") # 把所有比赛打包成一个列表 games_list <- list(game_1, game_2)
步骤2:定义单场比赛的球员对生成函数
我们需要一个函数,输入单场比赛的首发名单,输出这场比赛里所有的无序球员对(毕竟Andy和Bob同场,跟Bob和Andy同场是一回事):
get_player_pairs <- function(game) { # 用combn生成所有2人组合,转置后转成data.frame combn(game, 2) %>% t() %>% as.data.frame(stringsAsFactors = FALSE) %>% # 对每行的两个球员排序,确保无序对的格式统一 mutate(across(c(V1, V2), sort)) %>% # 重命名列名,匹配你期望的n_1、n_2 rename(n_1 = V1, n_2 = V2) }
步骤3:用purrr批量处理所有比赛
这里用map_dfr函数,它会自动把map处理后的多个data.frame合并成一个大的data.frame,省去手动合并的麻烦:
# 遍历所有比赛,生成所有场次的球员对 all_pairs <- map_dfr(games_list, get_player_pairs)
步骤4:统计同场次数并整理结果
最后用dplyr的分组统计功能,计算每个球员对的同场首发次数:
# 分组统计每个球员对的同场次数 final_result <- all_pairs %>% group_by(n_1, n_2) %>% summarise(games = n(), .groups = "drop") # 查看最终结果 final_result
运行这段代码后,你会得到这样的结果(以你给的两场比赛为例):
A tibble: 14 × 3n_1 n_2 games
1 Andy Bob 1
2 Andy Chris 2
3 Andy Doug 1
4 Andy Evan 2
5 Andy Fred 1
6 Andy George 1
7 Bob Chris 1
8 Bob Doug 1
9 Bob Evan 1
10 Chris Doug 1
11 Chris Evan 2
12 Chris Fred 1
13 Chris George 1
14 Evan Fred 1
这样就完美实现了你想要的包含球员对(n_1、n_2)和同场次数(games)的data.frame啦!如果之后有更多比赛数据,只需要把新的game_x加入到games_list里就行,代码完全可以复用~
内容的提问来源于stack exchange,提问作者pssguy

