如何用dplyr批量查找R数据框中各球员的缺失GW值?
批量查找球员缺失的GW值(dplyr实现)
问题描述
我需要在这份足球数据集中找出每个球员缺失的GW(比赛周)值。目前能用setdiff找到单个球员的缺失周,但数据里球员很多,逐个处理效率低,还不想用循环。求用dplyr实现批量处理,最终得到包含球员姓名和缺失GW列表两列的数据框。
现有单球员处理代码:
Num_GW <- seq(1,38,1) setdiff(Num_GW,City_LS %>% filter(name="Kevin De Bruyne") %>% select(GW) %>% unique() %>% pull())
示例数据集(dput结果):
structure(list(name = c("Kevin De Bruyne", "Bernardo Mota Veiga de Carvalho e Silva", "Kevin De Bruyne", "Bernardo Mota Veiga de Carvalho e Silva", "Kevin De Bruyne", "Bernardo Mota Veiga de Carvalho e Silva", "Kevin De Bruyne", "Bernardo Mota Veiga de Carvalho e Silva", "Kevin De Bruyne", "Bernardo Mota Veiga de Carvalho e Silva", "Kevin De Bruyne", "Bernardo Mota Veiga de Carvalho e Silva", "Kevin De Bruyne", "Bernardo Mota Veiga de Carvalho e Silva", "Kevin De Bruyne", "Bernardo Mota Veiga de Carvalho e Silva", "Kevin De Bruyne", "Bernardo Mota Veiga de Carvalho e Silva", "Kevin De Bruyne", "Bernardo Mota Veiga de Carvalho e Silva", "Kevin De Bruyne", "Bernardo Mota Veiga de Carvalho e Silva", "Kevin De Bruyne", "Bernardo Mota Veiga de Carvalho e Silva", "Kevin De Bruyne", "Bernardo Mota Veiga de Carvalho e Silva", "Kevin De Bruyne", "Bernardo Mota Veiga de Carvalho e Silva", "Kevin De Bruyne", "Bernardo Mota Veiga de Carvalho e Silva", "Kevin De Bruyne", "Bernardo Mota Veiga de Carvalho e Silva", "Kevin De Bruyne", "Bernardo Mota Veiga de Carvalho e Silva", "Kevin De Bruyne", "Bernardo Mota Veiga de Carvalho e Silva", "Kevin De Bruyne", "Bernardo Mota Veiga de Carvalho e Silva", "Kevin De Bruyne", "Bernardo Mota Veiga de Carvalho e Silva", "Bernardo Mota Veiga de Carvalho e Silva", "Kevin De Bruyne", "Bernardo Mota Veiga de Carvalho e Silva", "Kevin De Bruyne", "Kevin De Bruyne", "Bernardo Mota Veiga de Carvalho e Silva", "Kevin De Bruyne", "Bernardo Mota Veiga de Carvalho e Silva", "Kevin De Bruyne", "Bernardo Mota Veiga de Carvalho e Silva", "Kevin De Bruyne", "Bernardo Mota Veiga de Carvalho e Silva", "Bernardo Mota Veiga de Carvalho e Silva", "Kevin De Bruyne", "Kevin De Bruyne", "Bernardo Mota Veiga de Carvalho e Silva", "Kevin De Bruyne", "Bernardo Mota Veiga de Carvalho e Silva", "Bernardo Mota Veiga de Carvalho e Silva", "Kevin De Bruyne", "Bernardo Mota Veiga de Carvalho e Silva", "Kevin De Bruyne", "Bernardo Mota Veiga de Carvalho e Silva", "Kevin De Bruyne", "Bernardo Mota Veiga de Carvalho e Silva", "Kevin De Bruyne", "Bernardo Mota Veiga de Carvalho e Silva", "Kevin De Bruyne", "Kevin De Bruyne", "Kevin De Bruyne", "Bernardo Mota Veiga de Carvalho e Silva", "Bernardo Mota Veiga de Carvalho e Silva", "Kevin De Bruyne", "Bernardo Mota Veiga de Carvalho e Silva"), opp_team_name = c("Spurs", "Spurs", "Norwich", "Norwich", "Arsenal", "Arsenal", "Leicester", "Leicester", "Southampton", "Southampton", "Chelsea", "Chelsea", "Liverpool", "Liverpool", "Burnley", "Burnley", "Brighton", "Brighton", "Crystal Palace", "Crystal Palace", "Man Utd", "Man Utd", "Everton", "Everton", "West Ham", "West Ham", "Aston Villa", "Aston Villa", "Watford", "Watford", "Wolves", "Wolves", "Leeds", "Leeds", "Newcastle", "Newcastle", "Leicester", "Leicester", "Brentford", "Brentford", "Arsenal", "Arsenal", "Chelsea", "Chelsea", "Southampton", "Southampton", "Brentford", "Brentford", "Norwich", "Norwich", "Spurs", "Spurs", "Everton", "Everton", "Man Utd", "Man Utd", "Crystal Palace", "Crystal Palace", "Burnley", "Burnley", "Liverpool", "Liverpool", "Brighton", "Brighton", "Watford", "Watford", "Leeds", "Leeds", "Newcastle", "Wolves", "Newcastle", "Wolves", "Aston Villa", "Aston Villa"), GW = c(1L, 1L, 2L, 2L, 3L, 3L, 4L, 4L, 5L, 5L, 6L, 6L, 7L, 7L, 8L, 8L, 9L, 9L, 10L, 10L, 11L, 11L, 12L, 12L, 13L, 13L, 14L, 14L, 15L, 15L, 16L, 16L, 17L, 17L, 18L, 18L, 19L, 19L, 20L, 20L, 21L, 21L, 22L, 22L, 23L, 23L, 24L, 24L, 25L, 25L, 26L, 26L, 27L, 27L, 28L, 28L, 29L, 29L, 31L, 31L, 32L, 32L, 33L, 33L, 34L, 34L, 35L, 35L, 36L, 36L, 36L, 36L, 38L, 38L)), class = "data.frame", row.names = c(NA, -74L))
解决方案(dplyr实现)
核心思路是按球员分组后,批量计算每个球员的缺失GW,无需循环。
完整代码
library(dplyr) # 定义全量GW范围(1到38周) Num_GW <- seq(1, 38, 1) # 批量生成每个球员的缺失GW数据框 missing_gw_df <- City_LS %>% group_by(name) %>% # 计算当前球员缺失的GW,用list包裹保证每个单元格存列表 mutate(missing_GW = list(setdiff(Num_GW, unique(GW)))) %>% # 只保留需要的列,并去重每个球员的记录 select(name, missing_GW) %>% distinct() %>% # 取消分组 ungroup() # 查看结果 print(missing_gw_df)
代码说明
group_by(name):按球员姓名分组,让后续操作对每个球员单独执行mutate(missing_GW = list(setdiff(Num_GW, unique(GW)))):unique(GW):先剔除当前球员GW列的重复值setdiff(Num_GW, ...):计算全量GW与当前球员已有GW的差集,得到缺失的GWlist():将差集结果包裹成列表,确保每个球员的缺失GW以列表形式存储在单元格中
select(name, missing_GW) %>% distinct():保留姓名和缺失GW列,且每个球员只留一行记录ungroup():取消分组,返回普通数据框格式
结果示例
运行后会得到如下格式的结果:
| name | missing_GW |
|---|---|
| Kevin De Bruyne | 30, 37 |
| Bernardo Mota Veiga de Carvalho e Silva | 30, 37 |
内容的提问来源于stack exchange,提问作者Din
相关产品推荐
相关产品推荐

