The first week of May is my favorite on the calendar. I love trying to solve puzzles. No puzzle delights me more than coming up with a winning strategy to make the absolute most of my dynasty rookie drafts. Despite a decade writing a monthly dynasty trade value column, I am rarely the most active trader in my own dynasty leagues. It varies from one league to another, but I average a few trades a year per league overall from June through April. May is a different story. I am a huge believer in moving around in rookie drafts to land as many of my favorite targets as possible. I get my guys as rookies and ride with them long-term.

With so much new information to sift through, May’s Dynasty Trade Value Chart article is a two-parter. Today’s part one will focus exclusively on how to value the incoming rookies. Part two, coming later this week, will focus on the impact of the draft on veteran player values.

Topics this month

ROADBLOCK

Base Rookie Pick Values

my_values <- gsheet2tbl("https://docs.google.com/spreadsheets/d/1opcVw2hPPdvWZK3lYBeBlO5PcnDjsEWJMC4O2Tan0Uc")

sleeper_join <- gsheet2tbl("https://docs.google.com/spreadsheets/d/1nhoX6VAmd7f3gPHRcLcfmSwE1NIQmKNyqIas7o3BqH0/edit?usp=sharing") %>% 
  select(dan_id, sleeper_id)

my_values <- 
  my_values %>% 
  left_join(sleeper_join) %>% 
  mutate(sleeper_id = as.character(sleeper_id))
## Joining with `by = join_by(dan_id)`
download_link <-
  "https://drive.google.com/uc?export=download&id=1uFG3EvvWRex7id8JPOvNTT9Z58HTvk6v"

positional_model <- 
  create_download_url(download_link) %>% 
  url() %>% 
  readRDS()

players <- 
  load_players()

players <- 
  load_ff_playerids() %>% 
  select(gsis_id, sleeper_id, mfl_id) %>% 
  right_join(players)
## Joining with `by = join_by(gsis_id)`
teams <- 
  load_teams()

players <- 
  teams %>% 
  select(team_abbr, team_logo_espn) %>% 
  right_join(players)
## Joining with `by = join_by(team_abbr)`
player_values <- 
  players %>% 
  filter(position %in% c("QB", "RB","WR","TE") & entry_year >= 2009) %>% 
  select(sleeper_id, gsis_id, mfl_id, team_logo_espn, headshot, birth_date, rookie_year, draft_number) %>% 
  mutate(sleeper_id = as.character(sleeper_id)) %>% 
  filter(!is.na(sleeper_id)) %>% 
  right_join(my_values)
## Joining with `by = join_by(sleeper_id)`

Superflex Rookie Values

picks24 <- 
  load_draft_picks(seasons = 2024) %>% 
  filter(position %in% (c("QB","RB","WR","TE")))%>% 
  select(team, round, pick, Player = pfr_player_name, age, college) %>% 
  mutate(Player = ifelse(Player == "Marvin Harrison", "Marvin Harrison Jr.", Player),
         Player = ifelse(Player == "Tyrone Tracy", "Tyrone Tracy Jr.", Player))


my_rookies <- 
my_values %>% 
  filter(Rookie == "Yes") %>% 
  select(dan_id, Player, sleeper_id, Position, Value, SF_Value) %>% 
  left_join(picks24) %>% 
  filter(!is.na(pick)) %>% 
  mutate(team = clean_team_abbrs(team))
## Joining with `by = join_by(Player)`
my_rookies <- 
  load_teams() %>% 
    select(team = team_abbr, team_logo_espn) %>% 
    mutate(team = clean_team_abbrs(team)) %>% 
    right_join(my_rookies)
## Joining with `by = join_by(team)`
my_rookies_sf <- 
my_rookies %>% 
  arrange(-SF_Value) %>% 
  mutate(rank = row_number())

my_rookies_ppr <- 
my_rookies %>% 
  arrange(-Value) %>% 
  mutate(rank = row_number())

my_rookies_sf %>% 
  select(rank, Player, Position, team_logo_espn, college, pick, SF_Value) %>% 
  gt() %>% 
  gt_img_rows(columns = team_logo_espn) %>% 
  gt_theme_nytimes()%>% 
  tab_header(
        title = "Rookie Values",
        subtitle = "Superflex Value Rankings (PPR)"
      ) %>%
      cols_label(SF_Value = "Value", team_logo_espn = "Team") %>% 
      data_color(
        columns = SF_Value,
        colors = scales::col_numeric(
          palette = c( "yellow", "green","blue"),
          domain = c(0, 50)
        )
      )
## Warning: Since gt v0.9.0, the `colors` argument has been deprecated.
## • Please use the `fn` argument instead.
## This warning is displayed once every 8 hours.
Rookie Values
Superflex Value Rankings (PPR)
rank Player Position Team college pick Value
1 Caleb Williams QB USC 1 46.0
2 Marvin Harrison Jr. WR Ohio St. 4 39.0
3 Malik Nabers WR LSU 6 32.0
4 Jayden Daniels QB LSU 2 32.0
5 Rome Odunze WR Washington 9 28.0
6 Drake Maye QB North Carolina 3 22.4
7 Brock Bowers TE Georgia 13 20.5
8 J.J. McCarthy QB Michigan 10 20.0
9 Xavier Worthy WR Texas 28 17.3
10 Jonathon Brooks RB Texas 46 16.1
11 Ladd McConkey WR Georgia 34 15.9
12 Brian Thomas WR LSU 23 15.3
13 Keon Coleman WR Florida St. 33 13.8
14 Bo Nix QB Oregon 12 13.8
15 Michael Penix QB Washington 8 13.4
16 Trey Benson RB Florida St. 66 12.8
17 Ricky Pearsall WR Florida 31 12.7
18 Xavier Legette WR South Carolina 32 10.6
19 Adonai Mitchell WR Texas 52 10.1
20 Ja'Lynn Polk WR Washington 37 9.4
21 Blake Corum RB Michigan 83 7.8
22 Jermaine Burton WR Alabama 80 7.5
23 Malachi Corley WR Western Kentucky 65 7.4
24 Roman Wilson WR Michigan 84 6.4
25 Troy Franklin WR Oregon 102 6.3
26 Jaylen Wright RB Tennessee 120 6.0
27 MarShawn Lloyd RB USC 88 5.9
28 Ben Sinnott TE Kansas St. 53 5.7
29 Jalen McMillan WR Washington 92 5.1
30 Luke McCaffrey WR Rice 100 4.6
31 Devontez Walker WR North Carolina 113 4.4
32 Javon Baker WR Central Florida 110 4.3
33 Ray Davis RB Kentucky 128 4.2
34 Braelon Allen RB Wisconsin 134 4.1
35 Bucky Irving RB Oregon 125 4.1
36 Isaac Guerendo RB Louisville 129 4.0
37 Will Shipley RB Clemson 127 3.9
38 Audric Estime RB Notre Dame 147 3.8
39 Kimani Vidal RB Troy 181 3.7
40 Ja'Tavion Sanders TE Texas 101 2.9
41 Malik Washington WR Virginia 184 2.8
42 Spencer Rattler QB South Carolina 150 2.6
43 Erick All TE Iowa 115 2.2
44 Theo Johnson TE Penn St. 107 2.2
45 Jacob Cowing WR Arizona 135 2.1
46 Tyrone Tracy Jr. RB Purdue 166 2.0
47 Dylan Laube RB New Hampshire 208 1.9
48 Ainias Smith WR Texas A&M 152 1.9
49 Cade Stover TE Ohio St. 123 1.8
50 Anthony Gould WR Oregon St. 142 1.7
51 Johnny Wilson WR Florida St. 185 1.7
52 Rasheen Ali RB Marshall 165 1.6
53 Jawhar Jordan RB Louisville 205 1.5
54 Tip Reiman TE Illinois 82 1.4
55 Jamari Thrash WR Louisville 156 1.4
56 Jaheim Bell TE Florida St. 231 1.4
57 Isaiah Davis RB South Dakota St. 173 1.3
58 Brenden Rice WR USC 225 1.2
59 Ryan Flournoy WR SE Missouri St. 216 1.1
60 Jared Wiley TE TCU 131 1.1
61 Bub Means WR Pittsburgh 170 0.9
62 Jordan Travis QB Florida St. 171 0.9
63 Jha'Quan Jackson WR Tulane 182 0.9
64 Keilan Robinson RB Texas 167 0.8
65 Jordan Whittington WR Texas 213 0.8
66 Joe Milton QB Tennessee 193 0.8
67 Tejhaun Palmer WR Ala-Birmingham 191 0.7
68 Casey Washington WR Illinois 187 0.7
69 Devin Leary QB Kentucky 218 0.7
70 Jase McClellan RB Alabama 186 0.5
71 AJ Barner TE Michigan 121 0.5
72 Tanner McLachlan TE Arizona 194 0.4
73 Michael Pratt QB Tulane 245 0.4

Calculating Rookie Values

The values you see above are based on a number of factors:

  1. Draft capital models. I’ve built a number of different regression models over the years based upon the strong correlation between how early a player was selected and his career fantasy value. Each are specific to each position and can adjust to scoring and format changes. For example, if you tell me a running back was selected 46th overall and give me no other information, the model can take into account the draft capital and position to predict the player’s career fantasy value for a PPR league (or any other format). This is the starting point to the process. The usefulness of having these historical numbers to fall back on is why I spend so much time calculating career player values in many different scoring systems. It is also why I estimate my current values on the same scale (as opposed to just saying the top guy is worth 9,999 and going from there).
  2. Projected usage. The draft capital model provides a great starting point but I believe there are common sense adjustments we can make to improve our value projections. The first is taking into account the player’s skills and his projected role. This is where we have to remind ourselves that not all NFL value directly translates to fantasy value. Gabriel Davis and Darnell Mooney each signed 3-year, $39M deals this spring. NFL franchises clearly place a very high value on speedy outside wide receivers who can stretch defenses vertically and open up space for the running game and underneath passing attack. A player with the profile of Brian Thomas Jr. may generally project for less fantasy value than a player with the profile of Ladd McConkey (especially in PPR scoring), despite going 11 picks higher. At the very least, the two are very close. Similarly, running backs who have three-down upside are among the highest-upside rookies possible. Based upon how Dave Canales talked about how he plans to use Jonathon Brooks and the usage we just saw from Rachaad White, the dynasty community is too low on Brooks.
stats <- 
load_player_stats() 

stats %>% 
  filter(season_type =="REG" & position %in% c("QB","RB","WR","TE")) %>% 
  group_by(recent_team, position) %>% 
  summarise(fp = sum(fantasy_points_ppr)) %>% 
  ungroup() %>% 
  filter(position =="RB") %>% 
  arrange(-fp) %>% 
  mutate(pos_rank = row_number()) %>% 
  gt()
## `summarise()` has grouped output by 'recent_team'. You can override using the
## `.groups` argument.
recent_team position fp pos_rank
MIA RB 554.80 1
DET RB 486.30 2
SF RB 485.60 3
ATL RB 420.80 4
DEN RB 406.50 5
TEN RB 401.56 6
BAL RB 400.70 7
CLE RB 397.60 8
PIT RB 395.00 9
KC RB 382.36 10
LA RB 375.60 11
NYJ RB 374.60 12
IND RB 373.10 13
BUF RB 371.00 14
WAS RB 370.10 15
NO RB 362.20 16
JAX RB 342.00 17
DAL RB 341.80 18
NE RB 341.50 19
CIN RB 337.50 20
ARI RB 336.60 21
CHI RB 334.20 22
PHI RB 319.28 23
TB RB 319.20 24
SEA RB 317.70 25
LV RB 307.10 26
NYG RB 299.20 27
GB RB 298.30 28
CAR RB 287.20 29
MIN RB 273.30 30
HOU RB 270.64 31
LAC RB 270.00 32

my_values %>% 
  filter(Rookie == "Yes") %>% 
  arrange(-SF_Value) %>% 
  mutate(pick = row_number()) %>% 
  select(pick, Player, team, Position, SF_Value) %>% 
  gt() %>% 
  gt_theme_nytimes()%>% 
  tab_header(
        title = "Rookie Values",
        subtitle = "Superflex Value Rankings (PPR)"
      ) %>%
      cols_label(SF_Value = "Value") %>% 
      data_color(
        columns = SF_Value,
        colors = scales::col_numeric(
          palette = c( "yellow", "green","blue"),
          domain = c(0, 50)
        )
      )
Rookie Values
Superflex Value Rankings (PPR)
pick Player team Position Value
1 Caleb Williams CHI QB 46.0
2 Marvin Harrison Jr. ARI WR 39.0
3 Malik Nabers NYG WR 32.0
4 Jayden Daniels WAS QB 32.0
5 Rome Odunze CHI WR 28.0
6 Drake Maye NE QB 22.4
7 Brock Bowers LV TE 20.5
8 J.J. McCarthy MIN QB 20.0
9 Xavier Worthy KC WR 17.3
10 Jonathon Brooks CAR RB 16.1
11 Ladd McConkey LAC WR 15.9
12 Brian Thomas JAX WR 15.3
13 Keon Coleman BUF WR 13.8
14 Bo Nix DEN QB 13.8
15 Michael Penix ATL QB 13.4
16 Trey Benson ARI RB 12.8
17 Ricky Pearsall SF WR 12.7
18 Xavier Legette CAR WR 10.6
19 Adonai Mitchell IND WR 10.1
20 Ja'Lynn Polk NE WR 9.4
21 Blake Corum LAR RB 7.8
22 Jermaine Burton CIN WR 7.5
23 Malachi Corley NYJ WR 7.4
24 Roman Wilson PIT WR 6.4
25 Troy Franklin DEN WR 6.3
26 Jaylen Wright MIA RB 6.0
27 MarShawn Lloyd GB RB 5.9
28 Ben Sinnott WAS TE 5.7
29 Jalen McMillan TB WR 5.1
30 Luke McCaffrey WAS WR 4.6
31 Devontez Walker BAL WR 4.4
32 Javon Baker NE WR 4.3
33 Ray Davis BUF RB 4.2
34 Braelon Allen NYJ RB 4.1
35 Bucky Irving TB RB 4.1
36 Isaac Guerendo SF RB 4.0
37 Will Shipley PHI RB 3.9
38 Audric Estime DEN RB 3.8
39 Kimani Vidal LAC RB 3.7
40 Ja'Tavion Sanders CAR TE 2.9
41 Malik Washington MIA WR 2.8
42 Spencer Rattler NO QB 2.6
43 Theo Johnson NYG TE 2.2
44 Erick All CIN TE 2.2
45 Jacob Cowing SF WR 2.1
46 Tyrone Tracy Jr. NYG RB 2.0
47 Ainias Smith PHI WR 1.9
48 Dylan Laube LV RB 1.9
49 Cade Stover HOU TE 1.8
50 Johnny Wilson PHI WR 1.7
51 Anthony Gould IND WR 1.7
52 Rasheen Ali BAL RB 1.6
53 Jawhar Jordan HOU RB 1.5
54 Jaheim Bell NE TE 1.4
55 Jamari Thrash CLE WR 1.4
56 Tip Reiman ARI TE 1.4
57 Isaiah Davis NYJ RB 1.3
58 Brenden Rice LAC WR 1.2
59 Jared Wiley KC TE 1.1
60 Ryan Flournoy DAL WR 1.1
61 Bub Means NO WR 0.9
62 Jha'Quan Jackson TEN WR 0.9
63 Jordan Travis NYJ QB 0.9
64 Jordan Whittington LAR WR 0.8
65 Kendall Milton NA RB 0.8
66 Keilan Robinson JAX RB 0.8
67 Joe Milton NE QB 0.8
68 Casey Washington ATL WR 0.7
69 Tejhaun Palmer ARI WR 0.7
70 Devin Leary BAL QB 0.7
71 Blake Watson NA RB 0.6
72 George Holani SEA RB 0.6
73 AJ Barner SEA TE 0.5
74 Jase McClellan ATL RB 0.5
75 Tanner McLachlan CIN TE 0.4
76 Michael Pratt NA QB 0.4
77 Dallin Holker NA TE 0.3
78 Dillon Johnson NA RB 0.3
79 Miyan Williams NA RB 0.2

The Lamb/Jefferson year compared to Jonathon Brooks and Trey Benson this year. Have recent events clouded our view? A lot of this lines up very well for Brooks.

I imbibed a ton of draft content and virtually no one had anything overly negative to say about Brooks. It is was almost unanimous among draft analysts that Brooks was a great prospect and as talented as any back in the class.

Under the radar is not the right way to put it but Brooks h

If I can stay in the top 2.05

Past Player Values

player_stats <- 
load_player_stats(seasons = 1999:2023) %>% 
  filter(season_type == "REG" & 
           position %in% c("QB","RB","WR","TE"))
per_passing_yard <- .04
per_passing_td <- 6
per_interception <- -1
per_fumble_lost <- -1
per_carry <- 0
per_rushing_first_down <- 0
per_rushing_yard <- .1
per_rushing_td <- 6
per_reception <- 1
per_receiving_first_down <- 0
per_receiving_yard <- .1
per_receiving_td <- 6
league_size <- 12
num_qb <- 1
num_rb <- 2
num_wr <- 3
num_te <- 1
num_sf <- 0
num_fl <- 1
num_starters <- 8
rb_ppr_prem <- 0
wr_ppr_prem <-0
te_ppr_prem <- 0
#put together all of the different variables into a dataframe
variable_names <- c("per_passing_yard",
"per_passing_td",
"per_interception",
"per_fumble_lost",
"per_carry",
"per_rushing_first_down",
"per_rushing_yard",
"per_rushing_td",
"per_reception",
"per_receiving_first_down",
"per_receiving_yard",
"per_receiving_td",
"league_size",
"num_qb",
"num_rb",
"num_wr",
"num_te",
"num_sf",
"num_fl",
"num_starters",
"rb_ppr_prem",
"wr_ppr_prem",
"te_ppr_prem"
)

# Get the values of variables
variable_values <- mget(variable_names)

# Create a dataframe with one row and columns named after the variable names
combined_data <- data.frame(t(unlist(variable_values)))

# Set the column names of the dataframe to the variable names
colnames(combined_data) <- variable_names
player_stats <- 
player_stats %>% 
  mutate(fumbles_lost = sum(sack_fumbles_lost, rushing_fumbles_lost, receiving_fumbles_lost)) %>% 
  mutate(fp = per_passing_yard * passing_yards +
per_passing_td * passing_tds +
per_interception * interceptions +
per_fumble_lost * fumbles_lost +
per_carry * carries +
per_rushing_first_down * rushing_first_downs +
per_rushing_yard * rushing_yards +
per_rushing_td * rushing_tds +
per_reception * receptions +
per_receiving_first_down * receiving_first_downs +
per_receiving_yard * receiving_yards +
per_receiving_td * receiving_tds)
player_stats <- 
player_stats %>% 
  mutate(fp = case_when(
    position == "RB" ~ fp + (rb_ppr_prem * receptions),
    position == "WR" ~ fp + (wr_ppr_prem * receptions),
    position == "TE" ~ fp + (te_ppr_prem * receptions),
    .default =  fp
  ))
annual_fantasy <- 
player_stats %>% 
  group_by(player_id, player_display_name, position, season) %>% 
  summarise(fppg = mean(fp), 
            games = n()) %>% 
  ungroup()
## `summarise()` has grouped output by 'player_id', 'player_display_name',
## 'position'. You can override using the `.groups` argument.
annual_fantasy <- 
annual_fantasy %>% 
  filter(games >= 5)
annual_fantasy <- 
annual_fantasy %>% 
  group_by(season, position) %>% 
  mutate(ppg_rank = rank(-fppg)
         ) %>% 
  ungroup()
annual_fantasy <- 
annual_fantasy %>% 
  mutate(starter_non_flex = 
           case_when(
             position == "QB" & ppg_rank <= num_qb * league_size ~ "yes", 
             position == "RB" & ppg_rank <= num_rb * league_size ~ "yes", 
             position == "WR" & ppg_rank <= num_wr * league_size ~ "yes", 
             position == "TE" & ppg_rank <= num_te * league_size ~ "yes",
                                                                .default = "no" 
          
         ))
annual_fantasy <- 
annual_fantasy %>% 
  filter(starter_non_flex == "no") %>% 
  group_by(season) %>% 
  mutate(superflex_rank = rank(-fppg)) %>% 
  ungroup() %>% 
  right_join(annual_fantasy)
## Joining with `by = join_by(player_id, player_display_name, position, season,
## fppg, games, ppg_rank, starter_non_flex)`
annual_fantasy <- 
annual_fantasy %>% 
  mutate(starter_super_flex = ifelse(superflex_rank <= as.numeric(league_size)* as.numeric(num_sf), "yes","no")
        )
annual_fantasy <- 
annual_fantasy %>% 
  filter(position != "QB") %>% 
  filter(starter_non_flex == "no") %>% 
  filter(starter_super_flex == "no") %>% 
  group_by(season) %>% 
  mutate(flex_rank = rank(-fppg)) %>% 
  right_join(annual_fantasy)
## Joining with `by = join_by(player_id, player_display_name, position, season,
## fppg, games, ppg_rank, starter_non_flex, superflex_rank, starter_super_flex)`
annual_fantasy <- 
annual_fantasy %>% 
  mutate(starter_flex = ifelse(flex_rank <= as.numeric(league_size)*as.numeric(num_fl),
                               "yes", "no"))
annual_fantasy <- 
annual_fantasy %>% 
  filter(starter_super_flex == "yes" | starter_flex == "yes" | starter_non_flex == "yes") %>% 
  group_by(season, position) %>% 
  mutate(replacement_value = min(fppg)) %>% 
  ungroup() 
annual_fantasy <- 
annual_fantasy %>% 
  mutate(PPGAR = fppg - replacement_value) %>% 
  arrange(-PPGAR)
values <- 
annual_fantasy %>% 
  mutate(
  season_value = PPGAR * games/14) %>% 
  arrange(-season_value) %>% 
  select(player_id, player_display_name, position, season, season_value)

values <- 
values %>% 
  arrange(season) %>% 
  pivot_wider(names_from = season, values_from = season_value) %>% 
  mutate(across(everything(), ~ifelse(is.na(.x), 0, .x))) %>% 
  mutate(career_value = rowSums(across(where(is.numeric)))) %>% 
  arrange(-career_value)
ids <- 
load_ff_playerids()

values_with_id <- 
ids %>% 
  select(player_id = gsis_id, name, birthdate, draft_year, draft_ovr) %>% 
  right_join(values)
## Joining with `by = join_by(player_id)`
#table with recent picks 
since09 <- 
values_with_id %>% 
  filter(draft_year >= 2009) %>% 
  arrange(-career_value) %>% 
  mutate(gsis_id = player_id)

draft_picks <- 
  load_draft_picks(seasons = 2009:2023) %>% 
  filter(position %in% c("QB","RB","WR","TE"))

draft_since09 <- 
draft_picks %>% 
  full_join(since09, by = "gsis_id") %>% 
  filter(!is.na(pfr_player_name))
my_values <- gsheet2tbl("https://docs.google.com/spreadsheets/d/1opcVw2hPPdvWZK3lYBeBlO5PcnDjsEWJMC4O2Tan0Uc")

sleeper_join <- gsheet2tbl("https://docs.google.com/spreadsheets/d/1nhoX6VAmd7f3gPHRcLcfmSwE1NIQmKNyqIas7o3BqH0/edit?usp=sharing") %>% 
  select(dan_id, sleeper_id)

my_values <- 
  my_values %>% 
  left_join(sleeper_join) %>% 
  mutate(sleeper_id = as.character(sleeper_id))
## Joining with `by = join_by(dan_id)`
download_link <-
  "https://drive.google.com/uc?export=download&id=1uFG3EvvWRex7id8JPOvNTT9Z58HTvk6v"

positional_model <- 
  create_download_url(download_link) %>% 
  url() %>% 
  readRDS()

players <- 
  load_players()

players <- 
  load_ff_playerids() %>% 
  select(gsis_id, sleeper_id, mfl_id) %>% 
  right_join(players)
## Joining with `by = join_by(gsis_id)`
teams <- 
  load_teams()

players <- 
  teams %>% 
  select(team_abbr, team_logo_espn) %>% 
  right_join(players)
## Joining with `by = join_by(team_abbr)`
player_values <- 
  players %>% 
  filter(position %in% c("QB", "RB","WR","TE") & entry_year >= 2009) %>% 
  select(sleeper_id, gsis_id, mfl_id, team_logo_espn, headshot, birth_date, rookie_year, draft_number) %>% 
  mutate(sleeper_id = as.character(sleeper_id)) %>% 
  filter(!is.na(sleeper_id)) %>% 
  right_join(my_values)
## Joining with `by = join_by(sleeper_id)`
draft_since09_no_id <- 
draft_since09 %>% 
  filter(is.na(gsis_id))

draft_since09 <- 
draft_since09 %>% 
  filter(!is.na(gsis_id)) %>% 
  left_join(player_values, by = "gsis_id") %>% 
  arrange(gsis_id) %>% 
  bind_rows(draft_since09_no_id) 


  
draft_since09 <- 
draft_since09 %>%
  mutate(career_value = ifelse(!is.na(career_value), career_value, 0),
        current_value = ifelse(!is.na(Value), Value, 0),
 total_value = career_value + current_value,
         position = position.x) %>%
  arrange(desc(total_value))

draft_since09 %>% 
  select(pfr_player_name, position, pick, current_value, career_value, total_value) %>% 
  filter(position == "WR" & pick >= 1 & pick <6) %>% 
  summarise(ave = mean(total_value))
## # A tibble: 1 × 1
##     ave
##   <dbl>
## 1  27.1
draft_since09 %>% 
  filter(position == "WR" & between(pick, 102-15, 102+15)) %>%
  select(player_display_name, Player, pick, total_value) %>% 
  arrange(-total_value)
## ── nflverse Draft Picks, via Pro Football Reference ────────────────────────────
## ℹ Data updated: 2024-05-03 01:09:30 EDT
## # A tibble: 60 × 4
##    player_display_name Player             pick total_value
##    <chr>               <chr>             <int>       <dbl>
##  1 Amon-Ra St. Brown   Amon-Ra St. Brown   112       64.6 
##  2 Nico Collins        Nico Collins         89       26.8 
##  3 T.Y. Hilton         <NA>                 92       26.0 
##  4 Eric Decker         <NA>                 87       22.2 
##  5 Kenny Golladay      <NA>                 96        7.56
##  6 Mike Williams       <NA>                101        6.41
##  7 John Brown          <NA>                 91        6.03
##  8 <NA>                Michael Wilson       94        5.3 
##  9 Jamison Crowder     Jamison Crowder     105        4.49
## 10 Cecil Shorts        <NA>                114        3.75
## # ℹ 50 more rows
draft_since09 %>% 
  filter(position == "WR") %>% 
  ggplot(aes(x = pick, y= total_value)) +
  geom_point()

The Rookie Quarterbacks

Crazy to write off Penix. What is the real difference between him and a rookie like McCarthy, Maye or Nix? If you are a contender this year, you should have two Top 20 quarterbacks. Maye’s early draft ADP is QB23, McCarthy’s is QB27, and Nix is QB31.

You’re underestimating the importance of TE-Premium scoring.