我已經從我的夢幻足球聯盟下載了所有資料,并一直在 R 中進行一些分析。我正在努力做的一件事是找出一種方法來確定每個球員每周的最佳球隊。也就是說,我聯盟中的每個球員都選擇了一組他們的球員作為首發球員和一組他們的球員作為替補。事后看來,我們知道每個玩家的實際得分,并且可以確定玩家選擇是否正確。
我的資料結構如下:
- Team = Fantasy Team(示例 10 中共包含 2 個)
- 周 = 這發生在哪一周(示例 16 中總共包含 1 個)
- Slot = 這個玩家的位置
- 玩家 = 玩家姓名
- 位置 = 球員 NFL 位置
- FPTS = 得分
structure(list(Team = c("Washington Beersnake", "Washington Beersnake",
"Washington Beersnake", "Washington Beersnake", "Washington Beersnake",
"Washington Beersnake", "Washington Beersnake", "Washington Beersnake",
"Washington Beersnake", "Washington Beersnake", "Washington Beersnake",
"Washington Beersnake", "Washington Beersnake", "Washington Beersnake",
"Washington Beersnake", "Washington Beersnake", "Dimmadome Doug",
"Dimmadome Doug", "Dimmadome Doug", "Dimmadome Doug", "Dimmadome Doug",
"Dimmadome Doug", "Dimmadome Doug", "Dimmadome Doug", "Dimmadome Doug",
"Dimmadome Doug", "Dimmadome Doug", "Dimmadome Doug", "Dimmadome Doug",
"Dimmadome Doug", "Dimmadome Doug", "Dimmadome Doug"), Week = c(1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1), SLOT = c("QB", "RB", "RB", "WR/TE",
"WR/TE", "WR/TE", "FLEX", "D/ST", "K", "Bench", "Bench", "Bench",
"Bench", "Bench", "Bench", "Bench", "QB", "RB", "RB", "WR/TE",
"WR/TE", "WR/TE", "FLEX", "D/ST", "K", "Bench", "Bench", "Bench",
"Bench", "Bench", "Bench", "Bench"), PLAYER = c("Justin Herbert",
"Alvin Kamara", "Saquon Barkley", "Terry McLaurin", "Keenan Allen",
"Brandon Aiyuk", "Myles Gaskin", "Buccaneers D/ST", "Matt Gay",
"William Fuller V", "AJ Dillon", "Marvin Jones Jr.", "Justin Fields",
"Jalen Reagor", "J.D. McKissic", "Darnell Mooney", "Kyler Murray",
"David Montgomery", "Miles Sanders", "Tyreek Hill", "DK Metcalf",
"DeVonta Smith", "Raheem Mostert", "Washington D/ST", "Younghoe Koo",
"Javonte Williams", "Corey Davis", "Matt Ryan", "Henry Ruggs III",
"Curtis Samuel", "Nyheim Hines", "Tony Pollard"), Position = c("QB",
"RB", "RB", "WR", "WR", "WR", "RB", "D/ST", "K", "WR", "RB",
"WR", "QB", "WR", "RB", "WR", "QB", "RB", "WR", "WR", "WR", "WR",
"WR", "D/ST", "K", "RB", "WR", "QB", "WR", "WR", "RB", "RB"),
FPTS = c(15.38, 15.1, 2.7, 6.2, 10, 0, 7.6, 3, 12, 0, 2.6,
13.7, 6.7, 10.9, 0.8, 2.6, 41.56, 17.8, 13.3, 26.1, 12, 13.1,
2, 4, 6, 4.1, 21.7, 7.36, 4.6, 0, 8.2, 4.3)), row.names = c(NA,
-32L), class = c("tbl_df", "tbl", "data.frame"))

我想在資料框的末尾添加一個名為“最佳插槽”的新列。其邏輯如下。
- QB = 那周球隊中 QB 位置得分最高的球員
- RB1 = 那周球隊中 RB 位置得分最高的球員
- RB2 = 那周球隊中 RB 位置得分第二高的球員
- WR/TE1 = 該周球隊中 WR 或 TE 位置得分最高的球員
- WR/TE2 = 該周球隊中得分第二高且得分為 WR 或 TE 的球員
- WR/TE3 = 該周球隊中得分第三高且得分為 WR 或 TE 的球員
- RB/WR/TE = 那周球隊中擁有 RB/WR/TE 位置的最高剩余球員
- D/ST = 該周球隊中 D/ST 位置得分最高的球員
- K = 那周球隊中K位置得分最高的球員
- BENCH = 那周球隊中所有剩余的球員
這需要每周為每個玩家計算出來(資料示例中包含 2 個玩家的原因)
uj5u.com熱心網友回復:
我發現使用一些參考表更容易解決這個問題。FLEX 插槽讓事情變得有點棘手,因為我們必須首先找到最佳選擇,然后選擇剩余的最佳合格玩家。
無論如何,這可能是矯枉過正,但應該很好地擴展。
library(tidyverse)
#ASSUME ORIGINAL DATA IS STORED AS df
#To start, it might be helpful to have some reference tables.
#First, what positions are eligible to be placed in what slots?
possible_slots <- tibble(Position = c("QB", "RB", "RB", "WR", "WR", "TE", "TE", "D/ST", "K"),
possible_slot = c("QB", "RB", "FLEX", "WR/TE", "FLEX", "WR/TE", "FLEX", "D/ST", "K"))
#Next, for each slot, how many players can be selected?
topn <- tibble(possible_slot = c("QB", "RB", "WR/TE", "D/ST", "K"),
n_slots = c(1, 2, 3, 1, 1))
#Ok, now let's create a record for every potential slot that a player could conceivably take
all_possible_slots <- df %>%
left_join(possible_slots, by = "Position") %>%
left_join(topn, by = "possible_slot") %>%
#For each team, week and possible slot, rank the possiblity by points (descending)
group_by(Team, Week, possible_slot) %>%
#Note the use of ties.method = first to ensure only one record per rank
mutate(rank = rank(-FPTS, ties.method = "first")) %>%
ungroup()
#Now limit just to those records where the rank is <= the number of available slots
optimal_slots <- all_possible_slots %>%
filter(rank <= n_slots)
#The FLEX slot is special case, we need to select the best REMAINING player,
#i.e. one not selected in optimal_slots
flex_slot <- all_possible_slots %>%
#limit just to the FLEX slot and remove anyone selected in optimal_slots
filter(possible_slot == "FLEX") %>%
anti_join(optimal_slots %>% select(Team, Week, PLAYER)) %>%
#Among those remaining, take the highest scoring
group_by(Team, Week) %>%
filter(rank(-FPTS, ties.method = "first") == 1) %>%
ungroup()
#Now let's bring it all together with the original data.
df %>%
#append the optimal slot (including flex)
left_join({
optimal_slots %>%
bind_rows(flex_slot) %>%
#concatenate the slot and the rank in that slot
mutate(optimal_slot = paste0(possible_slot,
ifelse(possible_slot %in% c("RB", "WR/TE"), rank, ""))) %>%
select(Team, Week, PLAYER, optimal_slot)
}, by = c("Team", "Week", "PLAYER")) %>%
#Anyone without an optimal slot should be benched
mutate(optimal_slot = coalesce(optimal_slot, "BENCH"))
# A tibble: 32 x 7
Team Week SLOT PLAYER Position FPTS optimal_slot
<chr> <dbl> <chr> <chr> <chr> <dbl> <chr>
1 Washington Beersnake 1 QB Justin Herbert QB 15.4 QB
2 Washington Beersnake 1 RB Alvin Kamara RB 15.1 RB1
3 Washington Beersnake 1 RB Saquon Barkley RB 2.7 BENCH
4 Washington Beersnake 1 WR/TE Terry McLaurin WR 6.2 FLEX
5 Washington Beersnake 1 WR/TE Keenan Allen WR 10 WR/TE3
6 Washington Beersnake 1 WR/TE Brandon Aiyuk WR 0 BENCH
7 Washington Beersnake 1 FLEX Myles Gaskin RB 7.6 RB2
8 Washington Beersnake 1 D/ST Buccaneers D/ST D/ST 3 D/ST
9 Washington Beersnake 1 K Matt Gay K 12 K
10 Washington Beersnake 1 Bench William Fuller V WR 0 BENCH
# ... with 22 more rows
uj5u.com熱心網友回復:
您的所有要點都需要相同的技術,因此只需解決一個示例即可:
highest_score = df %>%
filter(SLOT = "QB") %>%
ungroup() %>%
summarise(max_score = max(FTPS))
highest_scoring_player_df = df %>%
filter(SLOT = "QB",
FTPS = highest_score) %>%
select(PLAYER)
highest_scoring_player = highest_scoring_player_df[1,1]
df = df %>%
mutate(optimal_slot = ifelse(PLAYER == highest_scoring_player, "QB", optimal_slot))
重復這個模式在每個位置后,您可以設定optimal_slot到BENCH了誰是尚未被分配最佳時隙的所有玩家:
df = df %>%
mutate(optimal_slot = ifelse(is.na(optimal_slot), "BENCH", optimal_slot))
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/409155.html
標籤:
