如何用R的dplyr按指定数量筛选FIFA2数据集各位置顶级球员
针对南安普顿球员按位置配额筛选顶级球员的解决方案
嘿,针对你这个按不同位置配额筛选南安普顿顶级球员的需求,我给你整理了一个用dplyr实现的简单方案,步骤清晰,适合R经验有限的朋友~
核心思路
因为不同位置需要筛选的数量不一样(后卫前4、中场前4、前锋前2、门将前1),不能直接用统一的top_n(),我们需要先定义位置-配额的对应规则,再关联到数据中分组筛选。
具体代码实现
library(dplyr) # 第一步:先筛选出南安普顿的球员 southampton_players <- fifa2 %>% filter(Club == "Southampton") # 第二步:定义各位置的筛选配额规则 position_quota <- tibble( Grp = c("后卫", "中场", "前锋", "门将"), # 对应你的位置分组字段 quota = c(4, 4, 2, 1) # 每个位置要取的顶级球员数量 ) # 第三步:关联规则+分组筛选顶级球员(按Growth降序) top_southampton_players <- southampton_players %>% # 把配额规则关联到每个球员的位置上 left_join(position_quota, by = "Grp") %>% # 按位置分组 group_by(Grp) %>% # 每组内按Growth降序排列(确保成长值最高的球员排在前面) arrange(desc(Growth), .by_group = TRUE) %>% # 每组取对应配额的球员数量 slice_head(n = first(quota)) %>% # 取消分组状态 ungroup() %>% # 移除临时的配额字段,保留原数据的字段 select(-quota) # 可选:按你要求的位置顺序(后卫→中场→前锋→门将)排序最终结果 top_southampton_players <- top_southampton_players %>% arrange(factor(Grp, levels = c("后卫", "中场", "前锋", "门将")))
代码解释
left_join():把每个球员的位置和对应的筛选配额绑定,确保每组知道自己要取多少人;arrange(desc(Growth), .by_group = TRUE):严格按位置分组后,把成长值最高的球员排在每组最前面;slice_head(n = first(quota)):因为同一位置的配额都是相同的,用first(quota)就能拿到该组需要筛选的数量;- 最后的
arrange(factor(...)):如果你的Grp字段是字符型,默认排序可能不符合你的要求,用factor()指定层级就能强制按「后卫、中场、前锋、门将」的顺序排列结果。
内容的提问来源于stack exchange,提问作者Vegas588
相关产品推荐
相关产品推荐

