# Read in Libraries
suppressWarnings(suppressMessages(library(dplyr)))
suppressWarnings(suppressMessages(library(data.table)))
suppressWarnings(suppressMessages(library(lubridate)))
suppressWarnings(suppressMessages(library(kernlab)))
suppressWarnings(suppressMessages(library(rvest)))
suppressWarnings(suppressMessages(library(ggplot2)))
suppressWarnings(suppressMessages(library(viridis)))
suppressWarnings(suppressMessages(library(RColorBrewer)))
suppressWarnings(suppressMessages(library(tidyr)))
suppressWarnings(suppressMessages(library(XML)))
suppressWarnings(suppressMessages(library(stringr)))
suppressWarnings(suppressMessages(library(ggvis)))
suppressWarnings(suppressMessages(library(knitr)))

# Men's NCAA Datasets
S1_MPlayers <- fread("../input/march-madness-analytics-2020/2020DataFiles/2020DataFiles/2020-Mens-Data/MPlayers.csv")

S1_MCities <- fread("../input/march-madness-analytics-2020/2020DataFiles/2020DataFiles/2020-Mens-Data/MDataFiles_Stage1/Cities.csv")
S1_MConferences <- fread("../input/march-madness-analytics-2020/2020DataFiles/2020DataFiles/2020-Mens-Data/MDataFiles_Stage1/Conferences.csv")
S1_MConferenceTourneyGames <- fread("../input/march-madness-analytics-2020/2020DataFiles/2020DataFiles/2020-Mens-Data/MDataFiles_Stage1/MConferenceTourneyGames.csv")
S1_MGameCities <- fread("../input/march-madness-analytics-2020/2020DataFiles/2020DataFiles/2020-Mens-Data/MDataFiles_Stage1/MGameCities.csv")
S1_MMasseyOrdinals <- fread("../input/march-madness-analytics-2020/2020DataFiles/2020DataFiles/2020-Mens-Data/MDataFiles_Stage1/MMasseyOrdinals.csv")
S1_MNCAATourneyCompactResults <- fread("../input/march-madness-analytics-2020/2020DataFiles/2020DataFiles/2020-Mens-Data/MDataFiles_Stage1/MNCAATourneyCompactResults.csv")
S1_MNCAATourneyDetailedResults <- fread("../input/march-madness-analytics-2020/2020DataFiles/2020DataFiles/2020-Mens-Data/MDataFiles_Stage1/MNCAATourneyDetailedResults.csv")
S1_MNCAATourneySeedRoundSlots <- fread("../input/march-madness-analytics-2020/2020DataFiles/2020DataFiles/2020-Mens-Data/MDataFiles_Stage1/MNCAATourneySeedRoundSlots.csv")
S1_MNCAATourneySeeds <- fread("../input/march-madness-analytics-2020/2020DataFiles/2020DataFiles/2020-Mens-Data/MDataFiles_Stage1/MNCAATourneySeeds.csv")
S1_MNCAATourneySlots <- fread("../input/march-madness-analytics-2020/2020DataFiles/2020DataFiles/2020-Mens-Data/MDataFiles_Stage1/MNCAATourneySlots.csv")
S1_MRegularSeasonCompactResults <- fread("../input/march-madness-analytics-2020/2020DataFiles/2020DataFiles/2020-Mens-Data/MDataFiles_Stage1/MRegularSeasonCompactResults.csv")
S1_MRegularSeasonDetailedResults <- fread("../input/march-madness-analytics-2020/2020DataFiles/2020DataFiles/2020-Mens-Data/MDataFiles_Stage1/MRegularSeasonDetailedResults.csv")
S1_MSeasons <- fread("../input/march-madness-analytics-2020/2020DataFiles/2020DataFiles/2020-Mens-Data/MDataFiles_Stage1/MSeasons.csv")
S1_MSecondaryTourneyCompactResults <- fread("../input/march-madness-analytics-2020/2020DataFiles/2020DataFiles/2020-Mens-Data/MDataFiles_Stage1/MSecondaryTourneyCompactResults.csv")
S1_MSecondaryTourneyTeams <- fread("../input/march-madness-analytics-2020/2020DataFiles/2020DataFiles/2020-Mens-Data/MDataFiles_Stage1/MSecondaryTourneyTeams.csv")
S1_MTeamCoaches <- fread("../input/march-madness-analytics-2020/2020DataFiles/2020DataFiles/2020-Mens-Data/MDataFiles_Stage1/MTeamCoaches.csv")
S1_MTeamConferences <- fread("../input/march-madness-analytics-2020/2020DataFiles/2020DataFiles/2020-Mens-Data/MDataFiles_Stage1/MTeamConferences.csv")
S1_MTeams <- fread("../input/march-madness-analytics-2020/2020DataFiles/2020DataFiles/2020-Mens-Data/MDataFiles_Stage1/MTeams.csv")
S1_MTeamSpellings <- fread("../input/march-madness-analytics-2020/2020DataFiles/2020DataFiles/2020-Mens-Data/MDataFiles_Stage1/MTeamSpellings.csv")

# DayZero currently in character format, convert to date and create a new column for the final Championship date
S1_MSeasons$DayZero <- as.Date(S1_MSeasons$DayZero, "%m/%d/%Y")

S1_MSeasons$ChampionshipDate <- S1_MSeasons$DayZero + 154

# Create a normalized value 
S1_MSeasons$ChampionshipDate_MonthDay <- S1_MSeasons$ChampionshipDate
year(S1_MSeasons$ChampionshipDate_MonthDay) <- 2020

S1_MSeasons$ChampionshipRelativeDays <- as.numeric(S1_MSeasons$ChampionshipDate_MonthDay - mean(S1_MSeasons$ChampionshipDate_MonthDay))

head(S1_MNCAATourneySeeds)
S1_MNCAATourneySeeds_SeedCount <- S1_MNCAATourneySeeds %>%
  group_by(Seed) %>%
  summarize(SeedCount = n())

S1_MNCAATourneySeeds <- merge(S1_MNCAATourneySeeds, S1_MNCAATourneySeeds_SeedCount, all.x=TRUE)

# Plot frequency of seeds across dataset
ggplot(S1_MNCAATourneySeeds, mapping = aes(reorder(Seed, -SeedCount))) + geom_bar(aes(fill = Seed))

# Seeds by Season
ggplot(S1_MNCAATourneySeeds, mapping = aes(Season, reorder(Seed, -SeedCount))) + geom_point(aes(color = Seed))

S1_MNCAATourneySeeds[, SeedCount := NULL]

# Create a dataset of all possible teams, seasons, and rankingdaynums - otherwise only RankingDayNums will be populated for when rankings were updated
S1_MMasterTeamsList <- expand.grid(TeamID = unique(S1_MTeams$TeamID), Season = unique(S1_MNCAATourneySeeds$Season))

# Merge on MTeams dataset for all teams/seasons, should not have any that do not match.
S1_MMasterTeamsList <- merge(S1_MMasterTeamsList, S1_MTeams, by=c("TeamID"), all.x=TRUE)
S1_MMasterTeamsList <- as.data.table(S1_MMasterTeamsList)

S1_MTS_MTeams <- merge(S1_MMasterTeamsList, S1_MNCAATourneySeeds, by=c("TeamID", "Season"), all.x=TRUE)

Counts <- S1_MTS_MTeams %>%
          count(TeamID, Season, sort = TRUE, name = "TeamID_by_Season")

# Percent of TeamIDs with multple occurrences of same season (should be 0% if data prepped correctly):
(1 - sum(Counts$TeamID_by_Season == 1)/nrow(Counts))

# Summary of merges made as a percent of Season/TeamID Combos
(1 - sum(is.na(S1_MTS_MTeams$Seed))/nrow(S1_MTS_MTeams))
# Accoding to this summary, only 17.8% of Season/TeamID Combos have a Tournament Seed populated.
# To reasonability-check this, we would expect 68 teams every year to make the tournament (this has varied by year, but it's a good reasoanbiltiy check)
68 / length(unique(S1_MTS_MTeams$TeamID))
64 / length(unique(S1_MTS_MTeams$TeamID))
# This would expect 17.4 - 18.5% of teams to be seeded in the tournament if 64-68 teams make it every year. Since 17.8% falls in this range, comfortable with this merge.

S1_MTS_MTeams <- as.data.table(S1_MTS_MTeams)

# Season by Team
ggplot(S1_MTS_MTeams[!is.na(Seed),], mapping = aes(Season, TeamName)) + geom_point(aes(color = Season))

# Total Seasons by Team
S1_MTS_MTeams_SeasonCount <- S1_MTS_MTeams %>%
  group_by(TeamID) %>%
  mutate(SeasonCount_Total = ifelse(!is.na(Seed), 1, 0)) %>%
  summarize(SeasonCount_Total = sum(SeasonCount_Total))

# Total Frequency of Seeds by Team
S1_MTS_MTeams_SeedCount <- S1_MTS_MTeams %>%
  group_by(TeamID, Seed) %>%
  mutate(SeedCount = ifelse(!is.na(Seed), 1, 0)) %>%
  summarize(SeedCount = sum(SeedCount))

# Slice up variables by number of seasons they've made the tournament in the previous X Years. If value = X, then they have made it all of the last X seasons leading up to
# the season in the record.

########################################
## TOURNAMENT MADE IN PREVIOUS SEASON ##

num.prev.seasons <- 1
max.season <- max(S1_MTS_MTeams$Season)

## Initialize with 2019 season
  DataSubset <- S1_MTS_MTeams[Season < max.season & Season >= (max.season-num.prev.seasons), ]
  S1_MTS_MTeams_SeasonCount_Last1 <- DataSubset %>%
    group_by(TeamID) %>%
    mutate(SeasonCount = ifelse(!is.na(Seed), 1, 0)) %>%
    summarize(SeasonCount_Last1 = sum(SeasonCount)) %>%
    mutate(Season = max(max.season))
  
# Loop through all other seasons - excluding 2019 from the list since it's already initialized.
for(i in unique(S1_MTS_MTeams$Season)[-which(unique(S1_MTS_MTeams$Season) == max(S1_MTS_MTeams$Season))]){
  DataSubset <- S1_MTS_MTeams[Season < i & Season >= (i-num.prev.seasons), ]
  DataSubset <- DataSubset %>%
    group_by(TeamID) %>%
    mutate(SeasonCount = ifelse(!is.na(Seed), 1, 0)) %>%
    summarize(SeasonCount_Last1 = sum(SeasonCount)) %>%
    mutate(Season = i)
  
  S1_MTS_MTeams_SeasonCount_Last1 <- rbind(S1_MTS_MTeams_SeasonCount_Last1, DataSubset)
}

#############################################
## TOURNAMENTS MADE IN PREVIOUS 3 SEASONS  ##
## RATIONALE: A TEAM OF SENIORS COULD HAVE ##
## MADE THE TOURNAMENT 3 PRIOR SEASONS     ##

num.prev.seasons <- 3
  
## Initialize with 2019 season
  DataSubset <- S1_MTS_MTeams[Season < max(Season) & Season >= (max(Season)-num.prev.seasons), ]
  S1_MTS_MTeams_SeasonCount_Last3 <- DataSubset %>%
    group_by(TeamID) %>%
    mutate(SeasonCount = ifelse(!is.na(Seed), 1, 0)) %>%
    summarize(SeasonCount_Last3 = sum(SeasonCount)) %>%
    mutate(Season = max.season)
  
# Loop through all other seasons - excluding 2019 from the list since it's already initialized.
for(i in unique(S1_MTS_MTeams$Season)[-which(unique(S1_MTS_MTeams$Season) == max(S1_MTS_MTeams$Season))]){
  DataSubset <- S1_MTS_MTeams[Season < i & Season >= (i-num.prev.seasons), ]
  DataSubset <- DataSubset %>%
    group_by(TeamID) %>%
    mutate(SeasonCount = ifelse(!is.na(Seed), 1, 0)) %>%
    summarize(SeasonCount_Last3 = sum(SeasonCount)) %>%
    mutate(Season = i)
  
  S1_MTS_MTeams_SeasonCount_Last3 <- rbind(S1_MTS_MTeams_SeasonCount_Last3, DataSubset)
}
 
###############################################
## TOURNAMENTS MADE IN PREVIOUS 5 SEASONS    ##
## RATIONALE: FAIRLY RECENT COACHING/PROGRAM ##
## EXPERIENCE                                ##

num.prev.seasons <- 5
  
## Initialize with 2019 season
  DataSubset <- S1_MTS_MTeams[Season < max(Season) & Season >= (max(Season)-num.prev.seasons), ]
  S1_MTS_MTeams_SeasonCount_Last5 <- DataSubset %>%
    group_by(TeamID) %>%
    mutate(SeasonCount = ifelse(!is.na(Seed), 1, 0)) %>%
    summarize(SeasonCount_Last5 = sum(SeasonCount)) %>%
    mutate(Season = max.season)
  
# Loop through all other seasons - excluding 2019 from the list since it's already initialized.
for(i in unique(S1_MTS_MTeams$Season)[-which(unique(S1_MTS_MTeams$Season) == max(S1_MTS_MTeams$Season))]){
  DataSubset <- S1_MTS_MTeams[Season < i & Season >= (i-num.prev.seasons), ]
  DataSubset <- DataSubset %>%
    group_by(TeamID) %>%
    mutate(SeasonCount = ifelse(!is.na(Seed), 1, 0)) %>%
    summarize(SeasonCount_Last5 = sum(SeasonCount)) %>%
    mutate(Season = i)
  
  S1_MTS_MTeams_SeasonCount_Last5 <- rbind(S1_MTS_MTeams_SeasonCount_Last5, DataSubset)
}

###############################################
## TOURNAMENTS MADE IN PREVIOUS 10 SEASONS   ##
## RATIONALE: SOLIDIFIED COACHING/PROGRAM    ##
## EXPERIENCE                                ##

num.prev.seasons <- 10
  
## Initialize with 2019 season
  DataSubset <- S1_MTS_MTeams[Season < max(Season) & Season >= (max(Season)-num.prev.seasons), ]
  S1_MTS_MTeams_SeasonCount_Last10 <- DataSubset %>%
    group_by(TeamID) %>%
    mutate(SeasonCount = ifelse(!is.na(Seed), 1, 0)) %>%
    summarize(SeasonCount_Last10 = sum(SeasonCount)) %>%
    mutate(Season = max.season)
  
# Loop through all other seasons - excluding 2019 from the list since it's already initialized.
for(i in unique(S1_MTS_MTeams$Season)[-which(unique(S1_MTS_MTeams$Season) == max(S1_MTS_MTeams$Season))]){
  DataSubset <- S1_MTS_MTeams[Season < i & Season >= (i-num.prev.seasons), ]
  DataSubset <- DataSubset %>%
    group_by(TeamID) %>%
    mutate(SeasonCount = ifelse(!is.na(Seed), 1, 0)) %>%
    summarize(SeasonCount_Last10 = sum(SeasonCount)) %>%
    mutate(Season = i)
  
  S1_MTS_MTeams_SeasonCount_Last10 <- rbind(S1_MTS_MTeams_SeasonCount_Last10, DataSubset)
}
  
###############################################
## TOURNAMENTS MADE IN PREVIOUS 15 SEASONS   ##
## RATIONALE: HISTORY OF PROGRAM EXCELLENCE  ##

num.prev.seasons <- 15
  
## Initialize with 2019 season
  DataSubset <- S1_MTS_MTeams[Season < max(Season) & Season >= (max(Season)-num.prev.seasons), ]
  S1_MTS_MTeams_SeasonCount_Last15 <- DataSubset %>%
    group_by(TeamID) %>%
    mutate(SeasonCount = ifelse(!is.na(Seed), 1, 0)) %>%
    summarize(SeasonCount_Last15 = sum(SeasonCount)) %>%
    mutate(Season = max.season)
  
# Loop through all other seasons - excluding 2019 from the list since it's already initialized.
for(i in unique(S1_MTS_MTeams$Season)[-which(unique(S1_MTS_MTeams$Season) == max(S1_MTS_MTeams$Season))]){
  DataSubset <- S1_MTS_MTeams[Season < i & Season >= (i-num.prev.seasons), ]
  DataSubset <- DataSubset %>%
    group_by(TeamID) %>%
    mutate(SeasonCount = ifelse(!is.na(Seed), 1, 0)) %>%
    summarize(SeasonCount_Last15 = sum(SeasonCount)) %>%
    mutate(Season = i)
  
  S1_MTS_MTeams_SeasonCount_Last15 <- rbind(S1_MTS_MTeams_SeasonCount_Last15, DataSubset)
}
  
###############################################################
# MERGE ON THE LOOKBACK TOURNAMENT APPEARANCES TO THE DATASET #

S1_MTS_MTeams <- merge(S1_MTS_MTeams, S1_MTS_MTeams_SeasonCount, by=c("TeamID"), all.x=TRUE)
# S1_MTS_MTeams <- merge(S1_MTS_MTeams, S1_MTS_MTeams_SeedCount, by=c("TeamID"), all.x=TRUE) # This would need more of an interacted version - might be more helpful to summarize into rolling averages, etc.
S1_MTS_MTeams <- merge(S1_MTS_MTeams, S1_MTS_MTeams_SeasonCount_Last1, by = c("TeamID", "Season"), all.x=TRUE)
S1_MTS_MTeams <- merge(S1_MTS_MTeams, S1_MTS_MTeams_SeasonCount_Last3, by = c("TeamID", "Season"), all.x=TRUE)
S1_MTS_MTeams <- merge(S1_MTS_MTeams, S1_MTS_MTeams_SeasonCount_Last5, by = c("TeamID", "Season"), all.x=TRUE)
S1_MTS_MTeams <- merge(S1_MTS_MTeams, S1_MTS_MTeams_SeasonCount_Last10, by = c("TeamID", "Season"), all.x=TRUE)
S1_MTS_MTeams <- merge(S1_MTS_MTeams, S1_MTS_MTeams_SeasonCount_Last15, by = c("TeamID", "Season"), all.x=TRUE)

Counts <- S1_MTS_MTeams_SeasonCount_Last3 %>%
          count(TeamID, Season, sort = TRUE, name = "TeamID_by_Season")

# Percent of TeamIDs with multple occurrences of same season (should be 0% if data prepped correctly):
(1 - sum(Counts$TeamID_by_Season == 1)/nrow(Counts))


# Change NAs to 0 - only appear in the SeasonCount fields
S1_MTS_MTeams[,7:12][is.na(S1_MTS_MTeams[,7:12])] <- 0

S1_MTS_MTeams[, Pct_Seasons_Last3 := SeasonCount_Last3 / 3]
S1_MTS_MTeams[, Pct_Seasons_Last5 := SeasonCount_Last5 / 5]
S1_MTS_MTeams[, Pct_Seasons_Last10 := SeasonCount_Last10 / 10]
S1_MTS_MTeams[, Pct_Seasons_Last15 := SeasonCount_Last15 / 15]

# Obtain a 1-to-1 mapping of TeamName and SeasonCount since SeasonCount is an aggregated field.
MTS_MTeams_Plotting_Data <- S1_MTS_MTeams[!duplicated(S1_MTS_MTeams[, c("TeamName","SeasonCount_Total"), with=FALSE]),]

# Plot this using geom_col instead of geom_bar
ggplot(MTS_MTeams_Plotting_Data[SeasonCount_Total > 1,], mapping = aes(reorder(TeamName, SeasonCount_Total), SeasonCount_Total)) + geom_col(aes(fill = SeasonCount_Total)) + ylab("Number of Appearances since 1985") + xlab("Team Name") + coord_flip()


CurrYear <- 2020

KenPomFinal <- fread(file.path(project.directory, "../input/webscrape-data/KenPom_03_19_Data.csv"))

# Before merging, read on the TeamID based on the list of alternate spellings provided.
KenPomFinal$Team <- tolower(KenPomFinal$Team)
KenPomFinal <- merge(KenPomFinal, S1_MTeamSpellings, by.x = c("Team"), by.y = c("TeamNameSpelling"), all.x=TRUE)
# Now merge on TeamID and Season
KenPomFinal_Merged <- merge(S1_MTS_MTeams, KenPomFinal, by.x = c("Season", "TeamID"), by.y = c("Season", "TeamID"), all.x = TRUE)
KenPomFinal_Merged <- unique(KenPomFinal_Merged[,1:37])
KenPomFinal_Merged<-KenPomFinal_Merged[, Team := NULL] # Extra column from webscrape

HSRatingFinal <- fread(file.path(project.directory, "../input/webscrape-data/HSRatingData.csv"))

# Drop any records that don't have a college - can't use them without knowing what college they came from
HSTest<- subset(HSRatingFinal, College !="")
HSTest$Rank <- as.integer(as.character(HSTest$Rank))
HSTest<- within(HSTest, YearLeft<-ifelse(Draft == "",Season+4,Draft))
HSTest<- within(HSTest, Freshman <- ifelse(YearLeft>Season,Season+1,"NA"))
HSTest <- within(HSTest, Sophomore <- ifelse(YearLeft>Season+1,Season+2,"NA"))
HSTest <- within(HSTest, Junior <- ifelse(YearLeft>Season+2,Season+3,"NA"))
HSTest <- within(HSTest, Senior <- ifelse(YearLeft>Season+3,Season+4,"NA"))
HSTest <- within(HSTest, TopTen<-ifelse(as.numeric(Rank)<11,"TopTen",ifelse(as.numeric(Rank)<26,"TopTwentyFive",ifelse(as.numeric(Rank)<51,"TopFifty","TopHundred"))))
sapply(HSTest, class)
HSRatingFinal <- as.data.table(HSRatingFinal)
HSRatingFinal<-HSRatingFinal[, Blank := NULL] # Extra column from webscrape

FreshTop<- as.data.frame(table("College" = HSTest$College,"Year" = HSTest$Freshman, "TopTen" = HSTest$TopTen))
colnames(FreshTop)[4]<-"Freshman"
SophTop<- as.data.frame(table("College" = HSTest$College,"Year" = HSTest$Sophomore, "TopTen" = HSTest$TopTen))
colnames(SophTop)[4]<-"Sophomore"
JuniorTop<- as.data.frame(table("College" = HSTest$College,"Year" = HSTest$Junior, "TopTen" = HSTest$TopTen))
colnames(JuniorTop)[4]<-"Junior"
SeniorTop<- as.data.frame(table("College" = HSTest$College,"Year" = HSTest$Senior, "TopTen" = HSTest$TopTen))
colnames(SeniorTop)[4]<-"Senior"

HSFinal<-merge(FreshTop,SophTop, by = c("College","Year","TopTen"))
HSFinal <-merge(HSFinal,JuniorTop, by = c("College","Year","TopTen"))
HSFinal <-merge(HSFinal,SeniorTop, by = c("College","Year","TopTen"))

# Before merging, read on the TeamID based on the list of alternate spellings provided.
HSFinal$College <- tolower(HSFinal$College)
HSFinal <- merge(HSFinal, S1_MTeamSpellings, by.x = c("College"), by.y = c("TeamNameSpelling"), all.x=TRUE)
HSFinal$Year <- as.integer(as.character(HSFinal$Year))
HSFinal <- as.data.table(HSFinal)
HSFinal<-HSFinal[, College := NULL] # Extra column from webscrape

HSFinalT100 <- subset(HSFinal, HSFinal$TopTen == "TopHundred")
HSFinalT100 <-HSFinalT100 %>% group_by(TeamID, Year) %>% summarise(FreshmanT100 = sum(Freshman, na.rm=T),SophomoreT100 = sum(Sophomore, na.rm=T),JuniorT100 = sum(Junior, na.rm=T),SeniorT100 = sum(Senior, na.rm=T))

HSFinalT50 <- subset(HSFinal, HSFinal$TopTen == "TopFifty")
HSFinalT50 <-HSFinalT25 %>% group_by(TeamID, Year) %>% summarise(FreshmanT50 = sum(Freshman, na.rm=T),SophomoreT50 = sum(Sophomore, na.rm=T),JuniorT50 = sum(Junior, na.rm=T),SeniorT50 = sum(Senior, na.rm=T))

HSFinalT25 <- subset(HSFinal, HSFinal$TopTen == "TopTwentyFive")
HSFinalT25 <-HSFinalT25 %>% group_by(TeamID, Year) %>% summarise(FreshmanT25 = sum(Freshman, na.rm=T),SophomoreT25 = sum(Sophomore, na.rm=T),JuniorT25 = sum(Junior, na.rm=T),SeniorT25 = sum(Senior, na.rm=T))

HSFinalT10 <- subset(HSFinal, HSFinal$TopTen == "TopTen")
HSFinalT10 <- HSFinalT10 %>% group_by(TeamID, Year) %>% summarise(FreshmanT10 = sum(Freshman, na.rm=T),SophomoreT10 = sum(Sophomore, na.rm=T),JuniorT10 = sum(Junior, na.rm=T),SeniorT10 = sum(Senior, na.rm=T))

# Now merge each file by TeamID and Season
HSFinal_Merged <- merge(KenPomFinal_Merged, HSFinalT100, by.x = c("Season", "TeamID"), by.y = c("Year", "TeamID"), all.x=TRUE)
HSFinal_Merged <- merge(HSFinal_Merged, HSFinalT50, by.x = c("Season", "TeamID"), by.y = c("Year", "TeamID"), all.x=TRUE)
HSFinal_Merged <- merge(HSFinal_Merged, HSFinalT25, by.x = c("Season", "TeamID"), by.y = c("Year", "TeamID"), all.x=TRUE)
HSFinal_Merged <- merge(HSFinal_Merged, HSFinalT10, by.x = c("Season", "TeamID"), by.y = c("Year", "TeamID"), all.x=TRUE)

# Change NAs to 0 - only appear in the T10 through T100 fields
HSFinal_Merged[,37:ncol(HSFinal_Merged)][is.na(HSFinal_Merged[,37:ncol(HSFinal_Merged)])] <- 0

# Set up an NA-filling function based on either surrounding values in the vector, or pulling backwards a value that was popualted later
fillNAgaps <- function(x, firstBack=FALSE) {
    ## NA's in a vector or factor are replaced with last non-NA values
    ## If firstBack is TRUE, it will fill in leading NA's with the first
    ## non-NA value. If FALSE, it will not change leading NA's.
    
    # If it's a factor, store the level labels and convert to integer
    lvls <- NULL
    if (is.factor(x)) {
        lvls <- levels(x)
        x    <- as.integer(x)
    }
 
    goodIdx <- !is.na(x)
 
    # These are the non-NA values from x only
    # Add a leading NA or take the first good value, depending on firstBack   
    if (firstBack)   goodVals <- c(x[goodIdx][1], x[goodIdx])
    else             goodVals <- c(NA,            x[goodIdx])

    # Fill the indices of the output vector with the indices pulled from
    # these offsets of goodVals. Add 1 to avoid indexing to zero.
    fillIdx <- cumsum(goodIdx)+1
    
    x <- goodVals[fillIdx]

    # If it was originally a factor, convert it back
    if (!is.null(lvls)) {
        x <- factor(x, levels=seq_along(lvls), labels=lvls)
    }

    x
}

# Massey Ordinals have multiple records per Season & Team - transform this into Wide format first before merging so it is more useful
S1_MMasseyOrdinals_WIDE <- spread(S1_MMasseyOrdinals, SystemName, OrdinalRank)

# Create a dataset of all possible teams, seasons, and rankingdaynums - otherwise only RankingDayNums will be populated for when rankings were updated
S1_MMasseyOrdinals_AllDays <- expand.grid(RankingDayNum = 1:154, TeamID = unique(S1_MMasseyOrdinals_WIDE$TeamID), Season = unique(S1_MMasseyOrdinals_WIDE$Season))

# Merge on MMasseyOrdinals_Wide dataset for any valid records, populated NA for all others
S1_MMasseyOrdinals_AllDays <- merge(S1_MMasseyOrdinals_AllDays, S1_MMasseyOrdinals_WIDE, by=c("RankingDayNum", "TeamID", "Season"), all.x=TRUE)
S1_MMasseyOrdinals_AllDays <- as.data.table(S1_MMasseyOrdinals_AllDays)

# Record the first date that each ranking is populated in the datasets, in case we need to prep the data further later on
minRankingDayNum <- as.numeric(vector())
for(ranking in names(S1_MMasseyOrdinals_AllDays)[4:ncol(S1_MMasseyOrdinals_AllDays)]){
  minRankingDayNum <- c(minRankingDayNum, min(S1_MMasseyOrdinals_AllDays[!is.na(eval(as.name(ranking))),]$RankingDayNum))
}
names(minRankingDayNum) <- names(S1_MMasseyOrdinals_AllDays)[4:ncol(S1_MMasseyOrdinals_AllDays)]

# Intitialize dataset with same characteristics, tricking it into an aggressive filter that will eliminate all rows
S1_MMasseyOrdinals_AllDays_agg <- S1_MMasseyOrdinals_AllDays[Season < 1900,]

for(team in unique(S1_MMasseyOrdinals_AllDays$TeamID)){
  
  for(seas in unique(S1_MMasseyOrdinals_AllDays$Season)){
  
    S1_MMasseyOrdinals_WIDE_teamsubset <- as.data.table(S1_MMasseyOrdinals_AllDays[TeamID == team & Season == seas,])
    
    for(ranking in names(S1_MMasseyOrdinals_AllDays)[4:ncol(S1_MMasseyOrdinals_AllDays)]){
    
      # Fill the leading NA's with the first good value in addition to any gapped NAs
      S1_MMasseyOrdinals_WIDE_teamsubset[,which(names(S1_MMasseyOrdinals_WIDE_teamsubset) == ranking)] <- fillNAgaps(S1_MMasseyOrdinals_WIDE_teamsubset[,eval(as.name(ranking))], firstBack=TRUE)
      
    }
    
  S1_MMasseyOrdinals_AllDays_agg <- rbind(S1_MMasseyOrdinals_AllDays_agg, S1_MMasseyOrdinals_WIDE_teamsubset)
  
  }
  
  }

S1_MMasseyOrdinals_AllDays_final <- S1_MMasseyOrdinals_AllDays_agg[!duplicated(S1_MMasseyOrdinals_AllDays_agg), ]

Counts_MasseyPrep2 <-
 S1_MMasseyOrdinals_AllDays_final %>%
 count(TeamID, Season, RankingDayNum, sort = TRUE, name = "TeamID_Season_by_RankingDayNum")

S1_MMasseyOrdinals_AllDays_final$row_NAs <- rowSums(is.na(S1_MMasseyOrdinals_AllDays_final[, 4:ncol(S1_MMasseyOrdinals_AllDays)]))

# Check how many rows have all NA values
sum(S1_MMasseyOrdinals_AllDays_final$row_NAs == 174) / nrow(S1_MMasseyOrdinals_AllDays_final)

# Now let's remove only the records that:
# 1) Are duplicated based on Season, TeamID, and RankingDayNum
# 2) Have a row_NAs value of 174 which indicates that it is completely NA (allowing us to keep the one that is actually populated)

S1_MMasseyOrdinals_AllDays_not_dup <- S1_MMasseyOrdinals_AllDays_final[!duplicated(S1_MMasseyOrdinals_AllDays_final), ]
S1_MMasseyOrdinals_AllDays_good_dup <- S1_MMasseyOrdinals_AllDays_final[duplicated(S1_MMasseyOrdinals_AllDays_final) & (S1_MMasseyOrdinals_AllDays_final$row_NAs < 174), ]

S1_MMasseyOrdinals_AllDays_final2 <- rbind(S1_MMasseyOrdinals_AllDays_not_dup, S1_MMasseyOrdinals_AllDays_good_dup) # Will append both lists together
S1_MMasseyOrdinals_AllDays_final3 <- S1_MMasseyOrdinals_AllDays_final2[!duplicated(S1_MMasseyOrdinals_AllDays_final2[,1:3]),] # Will keep the union of the two datasets

# Now we're still looking for the TeamID_Season_by_RankingDayNum column below to be all 1s

Counts_MasseyPrep3 <-
 S1_MMasseyOrdinals_AllDays_final3 %>%
 count(TeamID, Season, RankingDayNum, sort = TRUE, name = "TeamID_Season_by_RankingDayNum")

# Drop the row_NAs column
S1_MMasseyOrdinals_AllDays_final3[, row_NAs := NULL]

S1_MMasseyOrdinals_AllDays_agg_copy <- as.data.table(S1_MMasseyOrdinals_AllDays_final3)

for(ranking in names(minRankingDayNum)){
   
  S1_MMasseyOrdinals_AllDays_agg_copy[,which(names(S1_MMasseyOrdinals_AllDays_agg_copy) == ranking)] <- ifelse(S1_MMasseyOrdinals_AllDays_agg_copy[,eval(as.name(ranking))] < minRankingDayNum[which(names(minRankingDayNum) == ranking)], NA, S1_MMasseyOrdinals_AllDays_agg_copy[,eval(as.name(ranking))])
   
}

# TRX not working properly... drop for this check
dummy_for_checking <- S1_MMasseyOrdinals_AllDays_agg_copy
dummy_for_checking[, TRX := NULL]
minRankingDayNum_copy <- minRankingDayNum[-which(names(minRankingDayNum) == "TRX")]
minRankingDayNum_Adjusted <- apply(dummy_for_checking[,4:ncol(dummy_for_checking)],2,function(x) min(x, na.rm=TRUE)) # 2 indicates we want to apply to columns, not rows (which would = 1)

# Check that all minimum values match, should be 100%
sum(as.integer(minRankingDayNum_copy) == minRankingDayNum_Adjusted) / length(minRankingDayNum_copy)
which(minRankingDayNum_copy != minRankingDayNum_Adjusted)

S1_MMasseyOrdinals_MasterFile <- S1_MMasseyOrdinals_AllDays_agg_copy

# Teams, Seeds, Tournament History (Seasons) w/ Conferences
S1_Mens_TeamswConf <- merge(HSFinal_Merged, S1_MTeamConferences, by = c("TeamID", "Season"), all.x=TRUE)
# Teams, Seeds, Tournament History (Seasons), Conferences w/ Coaches
S1_Mens_TeamswConfCoaches <- merge(S1_Mens_TeamswConf, S1_MTeamCoaches, by = c("TeamID", "Season"), all.x=TRUE)

# First combine Regular Season Results with NCAA Tourney Results, adding an indicator for each
S1_MRegularSeasonDetailedResults[, RegSeason := 1]
S1_MRegularSeasonDetailedResults[, NCAATournament := 0]
S1_MRegularSeasonDetailedResults[, SecondaryTournament := 0]
S1_MNCAATourneyDetailedResults[, RegSeason := 0]
S1_MNCAATourneyDetailedResults[, NCAATournament := 1]
S1_MNCAATourneyDetailedResults[, SecondaryTournament := 0]

# Next combine Regular Season, NCAA Tourney, and Secondary Tourney Restults, adding an indicator for each
S1_MRegularSeasonCompactResults[, RegSeason := 1]
S1_MRegularSeasonCompactResults[, NCAATournament := 0]
S1_MRegularSeasonCompactResults[, SecondaryTournament := 0]
S1_MRegularSeasonCompactResults[, SecondaryTourney := NA] # SecondaryTourney file has addl column indicating which tournament it was...
S1_MNCAATourneyCompactResults[, RegSeason := 0]
S1_MNCAATourneyCompactResults[, NCAATournament := 1]
S1_MNCAATourneyCompactResults[, SecondaryTournament := 0]
S1_MNCAATourneyCompactResults[, SecondaryTourney := NA] # SecondaryTourney file has addl column indicating which tournament it was...
S1_MSecondaryTourneyCompactResults[, RegSeason := 0]
S1_MSecondaryTourneyCompactResults[, NCAATournament := 0]
S1_MSecondaryTourneyCompactResults[, SecondaryTournament := 1]

# Rbind together all Detailed Results files
S1_DetailedResults <- rbind(S1_MRegularSeasonDetailedResults, S1_MNCAATourneyDetailedResults)
# Rbind together all Compact Results files
S1_CompactResults <- rbind(S1_MRegularSeasonCompactResults, S1_MNCAATourneyCompactResults, S1_MSecondaryTourneyCompactResults)

# Detailed Game Results merged with Team Detail and Rankings, combined with the City that the game occurred in
S1_DetailedResults <- merge(S1_DetailedResults, S1_MGameCities_Detail, by = c("Season", "DayNum", "WTeamID", "LTeamID"), all.x=TRUE)

#####################################################################
# DUPLICATE DATASET INTO WINS (WINS = 1) and LOSSES (WINS = 0)

S1_DetailedResults_Winners <- S1_DetailedResults
S1_DetailedResults_Losers <- S1_DetailedResults

colnames(S1_DetailedResults_Winners)[1]<- "Season"
colnames(S1_DetailedResults_Winners)[2]<- "DayNum"
colnames(S1_DetailedResults_Winners)[3]<- "TeamID"
colnames(S1_DetailedResults_Winners)[4]<- "Opp_TeamID"
colnames(S1_DetailedResults_Winners)[5]<- "Score"
colnames(S1_DetailedResults_Winners)[6]<- "Opp_Score"
colnames(S1_DetailedResults_Winners)[8]<- "NumOT"

colnames(S1_DetailedResults_Losers)[1]<- "Season"
colnames(S1_DetailedResults_Losers)[2]<- "DayNum"
colnames(S1_DetailedResults_Losers)[3]<- "Opp_TeamID"
colnames(S1_DetailedResults_Losers)[4]<- "TeamID"
colnames(S1_DetailedResults_Losers)[5]<- "Opp_Score"
colnames(S1_DetailedResults_Losers)[6]<- "Score"
colnames(S1_DetailedResults_Losers)[8]<- "NumOT"

###
# Rename any of the DetailedResults dataset that began with a "W" or "L" indicator since we now handle winning/losing through the Win column, and "L" is no longer tied to the loser - just to the second team listed in the dataset.

# LOSERS DATASET PREP
Opposing_Team_Columns <- names(S1_DetailedResults_Losers)[grepl("^W", names(S1_DetailedResults_Losers))]
Opposing_Team_Columns_RENAME <- paste0("Opp_Team_", substr(Opposing_Team_Columns, 2, nchar(Opposing_Team_Columns)))
Team_Columns <- names(S1_DetailedResults_Losers)[grepl("^L", names(S1_DetailedResults_Losers))]
Team_Columns_RENAME <- paste0("Team_", substr(Team_Columns, 2, nchar(Team_Columns)))

setnames(S1_DetailedResults_Losers, old = Opposing_Team_Columns, new = Opposing_Team_Columns_RENAME)
setnames(S1_DetailedResults_Losers, old = Team_Columns, new = Team_Columns_RENAME)

# WINNERS DATASET PREP
Opposing_Team_Columns <- names(S1_DetailedResults_Winners)[grepl("^L", names(S1_DetailedResults_Winners))]
Opposing_Team_Columns_RENAME <- paste0("Opp_Team_", substr(Opposing_Team_Columns, 2, nchar(Opposing_Team_Columns)))
Team_Columns <- names(S1_DetailedResults_Winners)[grepl("^W", names(S1_DetailedResults_Winners))]
Team_Columns_RENAME <- paste0("Team_", substr(Team_Columns, 2, nchar(Team_Columns)))

setnames(S1_DetailedResults_Winners, old = Opposing_Team_Columns, new = Opposing_Team_Columns_RENAME)
setnames(S1_DetailedResults_Winners, old = Team_Columns, new = Team_Columns_RENAME)

# Loc column was caught in the ^L regex search, fix here.
colnames(S1_DetailedResults_Winners)[7]<- "Location"
colnames(S1_DetailedResults_Losers)[7]<- "Location"

S1_DetailedResults_Winners <- within(S1_DetailedResults_Winners, Win <- 1)
S1_DetailedResults_Losers <- within(S1_DetailedResults_Losers, Win <- 0)

# BIND THE PREPPED DETAILED RESULTS FILES TOGETHER
S1_DetailedResults_Total <- rbind(S1_DetailedResults_Winners,S1_DetailedResults_Losers)

# Regular season stats may end up being predictie of tournament stats, but would need to be compiled here before proceeding. Let's build these out just in case we need them later.
S1_DetailedResults_Total <- within(S1_DetailedResults_Total, Team_FGPct <- Team_FGM/Team_FGA)
S1_DetailedResults_Total <- within(S1_DetailedResults_Total, Team_FG3Pct <- Team_FGM3/Team_FGA3)
S1_DetailedResults_Total <- within(S1_DetailedResults_Total, Team_FTPct <- ifelse(is.na(Team_FTM/Team_FTA),0,Team_FTM/Team_FTA))
S1_DetailedResults_Total <- within(S1_DetailedResults_Total, Team_O_Eff <-  100*Score/(.5*((Team_FGA+.4*Team_FTA-1.07*(Team_OR/(Team_OR+Opp_Team_DR))*(Team_FGA-Team_FGM)+Team_TO)+(Opp_Team_FGA+.4*Opp_Team_FGA-1.07*(Opp_Team_OR/(Opp_Team_OR+Team_DR))*(Opp_Team_FGA-Opp_Team_FGM)+Opp_Team_TO))))
S1_DetailedResults_Total <- within(S1_DetailedResults_Total, Team_D_Eff<- 100*Opp_Score /(Opp_Team_FGA - Opp_Team_OR + Opp_Team_TO +(.4*Opp_Team_FTA)))

S1_DetailedResults_Total <- within(S1_DetailedResults_Total, Opp_Team_FGPct <- Opp_Team_FGM/Opp_Team_FGA)
S1_DetailedResults_Total <- within(S1_DetailedResults_Total, Opp_Team_FG3Pct <- Opp_Team_FGM3/Opp_Team_FGA3)
S1_DetailedResults_Total <- within(S1_DetailedResults_Total, Opp_Team_FTPct <- ifelse(is.na(Opp_Team_FTM/Opp_Team_FTA),0,Opp_Team_FTM/Opp_Team_FTA))
S1_DetailedResults_Total <- within(S1_DetailedResults_Total, Opp_Team_O_Eff <-  100*Score/(.5*((Opp_Team_FGA+.4*Opp_Team_FTA-1.07*(Opp_Team_OR/(Opp_Team_OR+Team_DR))*(Opp_Team_FGA-Opp_Team_FGM)+Opp_Team_TO)+(Team_FGA+.4*Team_FGA-1.07*(Team_OR/(Team_OR+Opp_Team_DR))*(Team_FGA-Team_FGM)+Team_TO))))
S1_DetailedResults_Total <- within(S1_DetailedResults_Total, Opp_Team_D_Eff<- 100*Score /(Team_FGA - Team_OR + Team_TO +(.4*Team_FTA)))

sumRegSeason <- S1_DetailedResults_Total %>% 
  filter(RegSeason == 1) %>%
  group_by(TeamID, Season) %>% 
  summarise(Team_FGM3agg = mean(Team_FGM3),
            Team_FGA3agg = mean(Team_FGA3),
            Team_FGMagg = mean(Team_FGM),
            Team_FGAagg = mean(Team_FGA),
            Team_FTMagg = mean(Team_FTM),
            Team_FTAagg = mean(Team_FTA),
            Team_ORagg = mean(Team_OR),
            Team_DRagg = mean(Team_DR),
            Team_ASTagg = mean(Team_Ast), 
            Team_TOagg = mean(Team_TO),
            Team_STLagg = mean(Team_Stl),
            Team_BLKagg = mean(Team_Blk),
            Team_PFagg = mean(Team_PF),
            Team_FGPctVar = var(Team_FGPct),
            Team_FG3PctVar = var(Team_FG3Pct),
            Team_FTPctVar = var(Team_FTPct),
            Team_TOVar = var(Team_TO),
            Team_OffRtg = mean(Team_O_Eff),
            Team_DffRtg = mean(Team_D_Eff),
            
            Opp_Team_FGM3agg = mean(Opp_Team_FGM3),
            Opp_Team_FGA3agg = mean(Opp_Team_FGA3),
            Opp_Team_FGMagg = mean(Opp_Team_FGM),
            Opp_Team_FGAagg = mean(Opp_Team_FGA),
            Opp_Team_FTMagg = mean(Opp_Team_FTM),
            Opp_Team_FTAagg = mean(Opp_Team_FTA),
            Opp_Team_ORagg = mean(Opp_Team_OR),
            Opp_Team_DRagg = mean(Opp_Team_DR),
            Opp_Team_ASTagg = mean(Opp_Team_Ast), 
            Opp_Team_TOagg = mean(Opp_Team_TO),
            Opp_Team_STLagg = mean(Opp_Team_Stl),
            Opp_Team_BLKagg = mean(Opp_Team_Blk),
            Opp_Team_PFagg = mean(Opp_Team_PF),
            Opp_Team_FGPctVar = var(Opp_Team_FGPct),
            Opp_Team_FG3PctVar = var(Opp_Team_FG3Pct),
            Opp_Team_FTPctVar = var(Opp_Team_FTPct),
            Opp_Team_TOVar = var(Opp_Team_TO),
            Opp_Team_OffRtg = mean(Opp_Team_O_Eff),
            Opp_Team_DffRtg = mean(Opp_Team_D_Eff))
sumRegSeason <- within(sumRegSeason, Team_AST2TO <- Team_ASTagg/Team_TOagg)
sumRegSeason <- within(sumRegSeason, Opp_Team_AST2TO <- Opp_Team_ASTagg/Opp_Team_TOagg)

last30regseas <- S1_DetailedResults_Total %>% 
  filter(RegSeason == 1 & DayNum > 100) %>%
  group_by(TeamID, Season) %>% 
  summarise(Team_FGM3aggl30 = mean(Team_FGM3),
            Team_FGA3aggl30 = mean(Team_FGA3),
            Team_FGMaggl30 = mean(Team_FGM),
            Team_FGAaggl30 = mean(Team_FGA),
            Team_FTMaggl30 = mean(Team_FTM),
            Team_FTAaggl30 = mean(Team_FTA),
            Team_ORaggl30 = mean(Team_OR),
            Team_DRaggl30 = mean(Team_DR),
            Team_ASTaggl30 = mean(Team_Ast), 
            Team_TOaggl30 = mean(Team_TO),
            Team_STLaggl30 = mean(Team_Stl),
            Team_BLKaggl30 = mean(Team_Blk),
            Team_PFaggl30 = mean(Team_PF),
            Team_FGPctVarl30 = var(Team_FGPct),
            Team_FG3PctVarl30 = var(Team_FG3Pct),
            Team_FTPctVarl30 = var(Team_FTPct),
            Team_TOVarl30 = var(Team_TO),
            Team_OffRtgl30 = mean(Team_O_Eff),
            Team_DffRtgl30 = mean(Team_D_Eff),
            
            Opp_Team_FGM3aggl30 = mean(Opp_Team_FGM3),
            Opp_Team_FGA3aggl30 = mean(Opp_Team_FGA3),
            Opp_Team_FGMaggl30 = mean(Opp_Team_FGM),
            Opp_Team_FGAaggl30 = mean(Opp_Team_FGA),
            Opp_Team_FTMaggl30 = mean(Opp_Team_FTM),
            Opp_Team_FTAaggl30 = mean(Opp_Team_FTA),
            Opp_Team_ORaggl30 = mean(Opp_Team_OR),
            Opp_Team_DRaggl30 = mean(Opp_Team_DR),
            Opp_Team_ASTaggl30 = mean(Opp_Team_Ast), 
            Opp_Team_TOaggl30 = mean(Opp_Team_TO),
            Opp_Team_STLaggl30 = mean(Opp_Team_Stl),
            Opp_Team_BLKaggl30 = mean(Opp_Team_Blk),
            Opp_Team_PFaggl30 = mean(Opp_Team_PF),
            Opp_Team_FGPctVarl30 = var(Opp_Team_FGPct),
            Opp_Team_FG3PctVarl30 = var(Opp_Team_FG3Pct),
            Opp_Team_FTPctVarl30 = var(Opp_Team_FTPct),
            Opp_Team_TOVarl30 = var(Opp_Team_TO),
            Opp_Team_OffRtgl30 = mean(Opp_Team_O_Eff),
            Opp_Team_DffRtgl30 = mean(Opp_Team_D_Eff))
last30regseas <- within(last30regseas, Team_AST2TOl30 <- Team_ASTaggl30/Team_TOaggl30)
last30regseas <- within(last30regseas, Opp_Team_AST2TOl30 <- Opp_Team_ASTaggl30/Opp_Team_TOaggl30)

# Now merge each file on TeamID and Season
S1_DetailedResults_Total <- merge(S1_DetailedResults_Total, sumRegSeason, by.x = c("Season", "TeamID"), by.y = c("Season", "TeamID"), all.x = TRUE)
S1_DetailedResults_Total <- merge(S1_DetailedResults_Total, last30regseas, by.x = c("Season", "TeamID"), by.y = c("Season", "TeamID"), all.x = TRUE)

# Make a numeric version of Seed variable before merging
S1_Mens_TeamswConfCoaches <- within(S1_Mens_TeamswConfCoaches,SeedNum<-as.numeric(gsub("\\D","",S1_Mens_TeamswConfCoaches$Seed)))

# Check number of records that have seed populated in this dataset
sum(!is.na(S1_Mens_TeamswConfCoaches$Seed))/nrow(S1_Mens_TeamswConfCoaches)

#####################################################################
# MERGE ON RANKINGS INFO - REQUIRES BEING TIED TO A SPECIFIC DAYNUM #

S1_MMasseyOrdinals_MasterFile <- as.data.table(S1_MMasseyOrdinals_MasterFile)

#####################
# OPTIONAL CHECK FOR MERGE KEY VALIDITY
# Counts <-
#  S1_MMasseyOrdinals_MasterFile %>%
#  count(TeamID, Season, RankingDayNum, sort = TRUE, name = "TeamID_by_Season_by_RankingDayNum")

# Percent of TeamIDs with multiple occurrences of same season (should be 0% if data prepped correctly):
# (1 - sum(Counts$TeamID_by_Season_by_RankingDayNum == 1)/nrow(Counts))

# Straightforward merge of Rankings Info by TeamID, Season, and RankingDayNum (which we've prepped to exist for every possible value)
S1_GameDetail_TeamDetail_W <- merge(S1_DetailedResults_Total, S1_MMasseyOrdinals_MasterFile, by.x=c("TeamID", "Season", "DayNum"), by.y=c("TeamID", "Season", "RankingDayNum"), all.x=TRUE)
S1_GameDetail_TeamDetail <- merge(S1_GameDetail_TeamDetail_W, S1_MMasseyOrdinals_MasterFile, by.x=c("Opp_TeamID", "Season", "DayNum"), by.y=c("TeamID", "Season", "RankingDayNum"), all.x=TRUE)

###############

#####################################################################
# MERGE ON TEAMS INFO - MERGED ONTO ANY DAYNUM, BY SEASON           #

# OPTIONAL CHECK FOR MERGE KEY VALIDITY
# Counts <-
#  S1_Mens_TeamswConfCoaches %>%
#  count(TeamID, Season, sort = TRUE, name = "TeamID_by_Season")

# Percent of TeamIDs with multiple occurrences of same season (should be 0% if data prepped correctly):
# (1 - sum(Counts$TeamID_by_Season == 1)/nrow(Counts))

# Straightforward merge of Team Info by TeamID and Season
S1_GameDetail_TeamDetail_W <- merge(S1_GameDetail_TeamDetail, S1_Mens_TeamswConfCoaches, by.x=c("TeamID", "Season"), by.y=c("TeamID", "Season"), all.x=TRUE)
S1_GameDetail_TeamDetail <- merge(S1_GameDetail_TeamDetail_W, S1_Mens_TeamswConfCoaches, by.x=c("Opp_TeamID", "Season"), by.y=c("TeamID", "Season"), all.x=TRUE)

# What percent of records did not merge a Seed in the NCAA Tournament dataset (should be 0% for those that are in the NCAA Tournament but can be > 0% for RegularSeason entries (not all make it, and that is the dataset that was merged on))
sum(is.na(S1_GameDetail_TeamDetail[NCAATournament == 1, ]$Seed.x))/nrow(S1_GameDetail_TeamDetail[NCAATournament == 1, ])
sum(is.na(S1_GameDetail_TeamDetail[NCAATournament == 1, ]$Seed.y))/nrow(S1_GameDetail_TeamDetail[NCAATournament == 1, ])

# Check what percent didn't merge a Seed in the RegularSeason dataset - should be roughly 1 - (68 / number of teams) except that some conferences play more games than others.
sum(is.na(S1_GameDetail_TeamDetail[RegSeason == 1, ]$Seed.x))/nrow(S1_GameDetail_TeamDetail[RegSeason == 1, ]) # Teams
sum(is.na(S1_GameDetail_TeamDetail[RegSeason == 1, ]$Seed.y))/nrow(S1_GameDetail_TeamDetail[RegSeason == 1, ]) # Opposing Teams (should be same number)

####################################################
# CLEAN UP DUPLICATED RECORDS FROM MULTIPLE MERGES #

###
# Rename any columns that were duplicated in the dataset from *Team Characteristics* or *Rankings* merges
Opposing_Team_Columns_.y_Merged <- names(S1_GameDetail_TeamDetail)[grepl("[.y]$", names(S1_GameDetail_TeamDetail))]
Opposing_Team_Columns_.y_RENAME <- paste0("Opp_Team_", substr(Opposing_Team_Columns_.y_Merged, 1, nchar(Opposing_Team_Columns_.y_Merged) - 2))
Team_Columns_.x_Merged <- names(S1_GameDetail_TeamDetail)[grepl("[.x]$", names(S1_GameDetail_TeamDetail))]
Team_Columns_.x_RENAME <- paste0("Team_", substr(Team_Columns_.x_Merged, 1, nchar(Team_Columns_.x_Merged) - 2))

setnames(S1_GameDetail_TeamDetail, old = Opposing_Team_Columns_.y_Merged, new = Opposing_Team_Columns_.y_RENAME)
setnames(S1_GameDetail_TeamDetail, old = Team_Columns_.x_Merged, new = Team_Columns_.x_RENAME)

# Merge on what round each of these games were. Should be able to just work with the Winning Team, since the 1 seed and 16 seed would merge the same way, for example.
S1_MNCAATourneySeedRoundSlots_Early <- S1_MNCAATourneySeedRoundSlots[, -c("LateDayNum")]
S1_MNCAATourneySeedRoundSlots_Late <- S1_MNCAATourneySeedRoundSlots[, -c("EarlyDayNum")]
setnames(S1_MNCAATourneySeedRoundSlots_Early, old = c("EarlyDayNum"), new = c("DayNum"))
setnames(S1_MNCAATourneySeedRoundSlots_Late, old = c("LateDayNum"), new = c("DayNum"))
S1_MNCAATourneySeedRoundSlots_ForMerge <- rbind(S1_MNCAATourneySeedRoundSlots_Early, S1_MNCAATourneySeedRoundSlots_Late)
setnames(S1_MNCAATourneySeedRoundSlots_ForMerge, old = c("Seed"), new = c("Team_Seed"))

S1_GTC_Detail_wSlots <- merge(S1_GameDetail_TeamDetail, S1_MNCAATourneySeedRoundSlots_ForMerge, by=c("Team_Seed", "DayNum"), all.x=TRUE)

# These should all be tournament games - DayNum 134 - 154
summary(S1_GTC_Detail_wSlots[!is.na(GameRound),]$DayNum)

Event_Dataset <- S1_GTC_Detail_wSlots

# Correct some incorrectly-labeled webscrapes
Event_Dataset <- within(Event_Dataset, AdjDDiff <- as.numeric(Team_AdjD)-as.numeric(Opp_Team_AdjD))
Event_Dataset <- within(Event_Dataset, AdjD_OppDiff <- as.numeric(Team_AdjD_Opp)-as.numeric(Opp_Team_AdjD_Opp))
Event_Dataset <- within(Event_Dataset, AdjDRankDiff <- Team_AdjDRank-Opp_Team_AdjDRank)
Event_Dataset <- within(Event_Dataset, AdjDRank_OppDiff <- Team_AdjDRank_Opp-Opp_Team_AdjDRank_Opp)
Event_Dataset <- within(Event_Dataset, AdjODiff <- as.numeric(Team_AdjO)-as.numeric(Opp_Team_AdjO))
Event_Dataset <- within(Event_Dataset, AdjO_OppDiff <- as.numeric(Team_AdjO_Opp)-as.numeric(Opp_Team_AdjO_Opp))
Event_Dataset <- within(Event_Dataset, AdjORankDiff <- Team_AdjORank-Opp_Team_AdjORank)
Event_Dataset <- within(Event_Dataset, AdjORank_OppDiff <- Team_AdjORank_Opp-Opp_Team_AdjORank_Opp)
Event_Dataset <- within(Event_Dataset, AdjTDiff <- as.numeric(Team_AdjT)-as.numeric(Opp_Team_AdjT))
Event_Dataset <- within(Event_Dataset, AdjTRankDiff <- Team_AdjTRank-Opp_Team_AdjTRank)
Event_Dataset <- within(Event_Dataset, AST2TOl30Diff <- Team_AST2TOl30-Opp_Team_AST2TOl30)
Event_Dataset <- within(Event_Dataset, ASTaggDiff <- Team_ASTagg-Opp_Team_ASTagg)
Event_Dataset <- within(Event_Dataset, ASTaggl30Diff <- Team_ASTaggl30-Opp_Team_ASTaggl30)
Event_Dataset <- within(Event_Dataset, BLKaggDiff <- Team_BLKagg-Opp_Team_BLKagg)
Event_Dataset <- within(Event_Dataset, BLKaggl30Diff <- Team_BLKaggl30-Opp_Team_BLKaggl30)
Event_Dataset <- within(Event_Dataset, DRaggDiff <- Team_DRagg-Opp_Team_DRagg)
Event_Dataset <- within(Event_Dataset, DRaggl30Diff <- Team_DRaggl30-Opp_Team_DRaggl30)
Event_Dataset <- within(Event_Dataset, FG3PctVarDiff <- Team_FG3PctVar-Opp_Team_FG3PctVar)
Event_Dataset <- within(Event_Dataset, FG3PctVarl30Diff <- Team_FG3PctVarl30-Opp_Team_FG3PctVarl30)
Event_Dataset <- within(Event_Dataset, FGA3aggDiff <- Team_FGA3agg-Opp_Team_FGA3agg)
Event_Dataset <- within(Event_Dataset, FGA3aggl30Diff <- Team_FGA3aggl30-Opp_Team_FGA3aggl30)
Event_Dataset <- within(Event_Dataset, FGAaggDiff <- Team_FGAagg-Opp_Team_FGAagg)
Event_Dataset <- within(Event_Dataset, FGAaggl30Diff <- Team_FGAaggl30-Opp_Team_FGAaggl30)
Event_Dataset <- within(Event_Dataset, FGM3aggDiff <- Team_FGM3agg-Opp_Team_FGM3agg)
Event_Dataset <- within(Event_Dataset, FGM3aggl30Diff <- Team_FGM3aggl30-Opp_Team_FGM3aggl30)
Event_Dataset <- within(Event_Dataset, FGMaggDiff <- Team_FGMagg-Opp_Team_FGMagg)
Event_Dataset <- within(Event_Dataset, FGMaggl30Diff <- Team_FGMaggl30-Opp_Team_FGMaggl30)
Event_Dataset <- within(Event_Dataset, FGPctVarDiff <- Team_FGPctVar-Opp_Team_FGPctVar)
Event_Dataset <- within(Event_Dataset, FGPctVarl30Diff <- Team_FGPctVarl30-Opp_Team_FGPctVarl30)
Event_Dataset <- within(Event_Dataset, FreshmanT10Diff <- Team_FreshmanT10-Opp_Team_FreshmanT10)
Event_Dataset <- within(Event_Dataset, FreshmanT100Diff <- Team_FreshmanT100-Opp_Team_FreshmanT100)
Event_Dataset <- within(Event_Dataset, FTAaggDiff <- Team_FTAagg-Opp_Team_FTAagg)
Event_Dataset <- within(Event_Dataset, FTAaggl30Diff <- Team_FTAaggl30-Opp_Team_FTAaggl30)
Event_Dataset <- within(Event_Dataset, FTMaggDiff <- Team_FTMagg-Opp_Team_FTMagg)
Event_Dataset <- within(Event_Dataset, FTMaggl30Diff <- Team_FTMaggl30-Opp_Team_FTMaggl30)
Event_Dataset <- within(Event_Dataset, FTPctVarDiff <- Team_FTPctVar-Opp_Team_FTPctVar)
Event_Dataset <- within(Event_Dataset, FTPctVarl30Diff <- Team_FTPctVarl30-Opp_Team_FTPctVarl30)
Event_Dataset <- within(Event_Dataset, JuniorT10Diff <- Team_JuniorT10-Opp_Team_JuniorT10)
Event_Dataset <- within(Event_Dataset, JuniorT100Diff <- Team_JuniorT100-Opp_Team_JuniorT100)
Event_Dataset <- within(Event_Dataset, LuckDiff <- as.numeric(Team_Luck)-as.numeric(Opp_Team_Luck))
Event_Dataset <- within(Event_Dataset, LuckRankDiff <- Team_LuckRank-Opp_Team_LuckRank)
Event_Dataset <- within(Event_Dataset, NCSOS_AdjEMDiff <- as.numeric(Team_NCSOS_AdjEM)-as.numeric(Opp_Team_NCSOS_AdjEM))
Event_Dataset <- within(Event_Dataset, NCSOS_AdjEMRankDiff <- as.numeric(Team_NCSOS_AdjEMRank)-as.numeric(Opp_Team_NCSOS_AdjEMRank))
Event_Dataset <- within(Event_Dataset, ORaggDiff <- Team_ORagg-Opp_Team_ORagg)
Event_Dataset <- within(Event_Dataset, ORaggl30Diff <- Team_ORaggl30-Opp_Team_ORaggl30)
Event_Dataset <- within(Event_Dataset, PFaggDiff <- Team_PFagg-Opp_Team_PFagg)
Event_Dataset <- within(Event_Dataset, PFaggl30Diff <- Team_PFaggl30-Opp_Team_PFaggl30)
Event_Dataset <- within(Event_Dataset, AdjEMDiff <- as.numeric(Team_AdjEM)-as.numeric(Opp_Team_AdjEM))
Event_Dataset <- within(Event_Dataset, ADJEM_SOSDiff <- as.numeric(Team_ADJEM_SOS)-as.numeric(Opp_Team_ADJEM_SOS))
Event_Dataset <- within(Event_Dataset, AdjEMRank_OppDiff <- Team_AdjEMRank_SOS-Opp_Team_AdjEMRank_SOS)
Event_Dataset <- within(Event_Dataset, RankDiff <- as.numeric(Team_Rank)-as.numeric(Opp_Team_Rank))
Event_Dataset <- within(Event_Dataset, SeedNumDiff <- Team_SeedNum-Opp_Team_SeedNum)
Event_Dataset <- within(Event_Dataset, SeniorT10Diff <- Team_SeniorT10-Opp_Team_SeniorT10)
Event_Dataset <- within(Event_Dataset, SeniorT100Diff <- Team_SeniorT100-Opp_Team_SeniorT100)
Event_Dataset <- within(Event_Dataset, SophomoreT10Diff <- Team_SophomoreT10-Opp_Team_SophomoreT10)
Event_Dataset <- within(Event_Dataset, SophomoreT100Diff <- Team_SophomoreT100-Opp_Team_SophomoreT100)
Event_Dataset <- within(Event_Dataset, STLaggDiff <- Team_STLagg-Opp_Team_STLagg)
Event_Dataset <- within(Event_Dataset, STLaggl30Diff <- Team_STLaggl30-Opp_Team_STLaggl30)
Event_Dataset <- within(Event_Dataset, TOaggDiff <- Team_TOagg-Opp_Team_TOagg)
Event_Dataset <- within(Event_Dataset, TOaggl30Diff <- Team_TOaggl30-Opp_Team_TOaggl30)
Event_Dataset <- within(Event_Dataset, TOVarl30Diff <- Team_TOVarl30-Opp_Team_TOVarl30)
Event_Dataset <- within(Event_Dataset, Team_PctOfrom3pt <- (3*Team_FGM3agg)/(Team_FGM3agg*3+Team_FGMagg*2+Team_FTMagg*1))
Event_Dataset <- within(Event_Dataset, Opp_Team_PctOfrom3pt <- (3*Opp_Team_FGM3agg)/(Opp_Team_FGM3agg*3+Opp_Team_FGMagg*2+Opp_Team_FTMagg*1))
Event_Dataset <- within(Event_Dataset, PctOfrom3ptDiff <- Team_PctOfrom3pt-Opp_Team_PctOfrom3pt)
Event_Dataset <- within(Event_Dataset, Team_PctOfromFT <- (1*Team_FTMagg)/(Team_FGM3agg*3+Team_FGMagg*2+Team_FTMagg*1))
Event_Dataset <- within(Event_Dataset, Opp_Team_PctOfromFT <- (1*Opp_Team_FTMagg)/(Opp_Team_FGM3agg*3+Opp_Team_FGMagg*2+Opp_Team_FTMagg*1))
Event_Dataset <- within(Event_Dataset, PctOfromFTDiff <- Team_PctOfrom3pt-Opp_Team_PctOfrom3pt)
Event_Dataset <- within(Event_Dataset, Team_AggresPct <- (Team_FTMagg/Team_FGMagg)/(Team_FGM3agg/Team_FGMagg))
Event_Dataset <- within(Event_Dataset, Opp_Team_AggresPct <- (Opp_Team_FTMagg/Opp_Team_FGMagg)/(Opp_Team_FGM3agg/Opp_Team_FGMagg))
Event_Dataset <- within(Event_Dataset, AggresPctDiff <- Team_AggresPct-Opp_Team_AggresPct)
Event_Dataset <- within(Event_Dataset, After1stWkd <- ifelse(DayNum>140,1,0))
Power5List <- c("B10","ACC","B12","P10","P12","BE","SEC")
Event_Dataset <- within(Event_Dataset, Team_Power5 <- ifelse(Team_Conf %in% Power5List,1,0))
Event_Dataset <- within(Event_Dataset, Opp_Team_Power5 <- ifelse(Opp_Team_Conf %in% Power5List,1,0))
Event_Dataset <- within(Event_Dataset, Power5Flag <- Team_Power5-Opp_Team_Power5)
Event_Dataset <- within(Event_Dataset, RemoveDups <- ifelse(TeamID>Opp_TeamID,0,1)) # Just creating a flag so that we can remove this if we want
Event_Dataset <- within(Event_Dataset, Eff_L30_Diff <- (Team_OffRtgl30-Team_DffRtgl30) -(Opp_Team_OffRtgl30-Opp_Team_DffRtgl30))
Event_Dataset <- within(Event_Dataset, Team_OffMomentum <- Team_OffRtgl30/Team_OffRtg)
Event_Dataset <- within(Event_Dataset, Team_DefMomentum <- Team_DffRtgl30/Team_DffRtg)
Event_Dataset <- within(Event_Dataset, Opp_Team_OffMomentum <- Opp_Team_OffRtgl30/Opp_Team_OffRtg)
Event_Dataset <- within(Event_Dataset, Opp_Team_DefMomentum <- Opp_Team_DffRtgl30/Opp_Team_DffRtg)
Event_Dataset <- within(Event_Dataset, OffMomentumDiff <- Team_OffMomentum-Opp_Team_OffMomentum)
Event_Dataset <- within(Event_Dataset, DefMomentumDiff <- Team_DefMomentum-Opp_Team_DefMomentum)

# Going to go ahead and develop the difference in Massey Ordinal Rankings for all variables in case they are significant
Event_Dataset <- within(Event_Dataset, Diff_7OT <- Team_7OT - Opp_Team_7OT) # Can't start a new variable name with a number
Event_Dataset <- within(Event_Dataset, ACU_Diff <- Team_ACU - Opp_Team_ACU)
Event_Dataset <- within(Event_Dataset, ADE_Diff <- Team_ADE - Opp_Team_ADE)
Event_Dataset <- within(Event_Dataset, AP_Diff <- Team_AP - Opp_Team_AP)
Event_Dataset <- within(Event_Dataset, ARG_Diff <- Team_ARG - Opp_Team_ARG)
Event_Dataset <- within(Event_Dataset, AUS_Diff <- Team_AUS - Opp_Team_AUS)
Event_Dataset <- within(Event_Dataset, BBT_Diff <- Team_BBT - Opp_Team_BBT)
Event_Dataset <- within(Event_Dataset, BCM_Diff <- Team_BCM - Opp_Team_BCM)
Event_Dataset <- within(Event_Dataset, BD_Diff <- Team_BD - Opp_Team_BD)
Event_Dataset <- within(Event_Dataset, BIH_Diff <- Team_BIH - Opp_Team_BIH)
Event_Dataset <- within(Event_Dataset, BKM_Diff <- Team_BKM - Opp_Team_BKM)
Event_Dataset <- within(Event_Dataset, BLS_Diff <- Team_BLS - Opp_Team_BLS)
Event_Dataset <- within(Event_Dataset, BNM_Diff <- Team_BNM - Opp_Team_BNM)
Event_Dataset <- within(Event_Dataset, BNT_Diff <- Team_BNT - Opp_Team_BNT)
Event_Dataset <- within(Event_Dataset, BOB_Diff <- Team_BOB - Opp_Team_BOB)
Event_Dataset <- within(Event_Dataset, BOW_Diff <- Team_BOW - Opp_Team_BOW)
Event_Dataset <- within(Event_Dataset, BP5_Diff <- Team_BP5 - Opp_Team_BP5)
Event_Dataset <- within(Event_Dataset, BPI_Diff <- Team_BPI - Opp_Team_BPI)
Event_Dataset <- within(Event_Dataset, BRZ_Diff <- Team_BRZ - Opp_Team_BRZ)
Event_Dataset <- within(Event_Dataset, BUR_Diff <- Team_BUR - Opp_Team_BUR)
Event_Dataset <- within(Event_Dataset, BWE_Diff <- Team_BWE - Opp_Team_BWE)
Event_Dataset <- within(Event_Dataset, CJB_Diff <- Team_CJB - Opp_Team_CJB)
Event_Dataset <- within(Event_Dataset, CMV_Diff <- Team_CMV - Opp_Team_CMV)
Event_Dataset <- within(Event_Dataset, CNG_Diff <- Team_CNG - Opp_Team_CNG)
Event_Dataset <- within(Event_Dataset, COL_Diff <- Team_COL - Opp_Team_COL)
Event_Dataset <- within(Event_Dataset, COX_Diff <- Team_COX - Opp_Team_COX)
Event_Dataset <- within(Event_Dataset, CPA_Diff <- Team_CPA - Opp_Team_CPA)
Event_Dataset <- within(Event_Dataset, CPR_Diff <- Team_CPR - Opp_Team_CPR)
Event_Dataset <- within(Event_Dataset, CRO_Diff <- Team_CRO - Opp_Team_CRO)
Event_Dataset <- within(Event_Dataset, CRW_Diff <- Team_CRW - Opp_Team_CRW)
Event_Dataset <- within(Event_Dataset, CTL_Diff <- Team_CTL - Opp_Team_CTL)
Event_Dataset <- within(Event_Dataset, D1A_Diff <- Team_D1A - Opp_Team_D1A)
Event_Dataset <- within(Event_Dataset, DAV_Diff <- Team_DAV - Opp_Team_DAV)
Event_Dataset <- within(Event_Dataset, DC_Diff <- Team_DC - Opp_Team_DC)
Event_Dataset <- within(Event_Dataset, DC2_Diff <- Team_DC2 - Opp_Team_DC2)
Event_Dataset <- within(Event_Dataset, DCI_Diff <- Team_DCI - Opp_Team_DCI)
Event_Dataset <- within(Event_Dataset, DDB_Diff <- Team_DDB - Opp_Team_DDB)
Event_Dataset <- within(Event_Dataset, DES_Diff <- Team_DES - Opp_Team_DES)
Event_Dataset <- within(Event_Dataset, DII_Diff <- Team_DII - Opp_Team_DII)
Event_Dataset <- within(Event_Dataset, DOK_Diff <- Team_DOK - Opp_Team_DOK)
Event_Dataset <- within(Event_Dataset, DOL_Diff <- Team_DOL - Opp_Team_DOL)
Event_Dataset <- within(Event_Dataset, DUN_Diff <- Team_DUN - Opp_Team_DUN)
Event_Dataset <- within(Event_Dataset, DWH_Diff <- Team_DWH - Opp_Team_DWH)
Event_Dataset <- within(Event_Dataset, EBB_Diff <- Team_EBB - Opp_Team_EBB)
Event_Dataset <- within(Event_Dataset, EBP_Diff <- Team_EBP - Opp_Team_EBP)
Event_Dataset <- within(Event_Dataset, ECK_Diff <- Team_ECK - Opp_Team_ECK)
Event_Dataset <- within(Event_Dataset, ENT_Diff <- Team_ENT - Opp_Team_ENT)
Event_Dataset <- within(Event_Dataset, ERD_Diff <- Team_ERD - Opp_Team_ERD)
Event_Dataset <- within(Event_Dataset, ESR_Diff <- Team_ESR - Opp_Team_ESR)
Event_Dataset <- within(Event_Dataset, FAS_Diff <- Team_FAS - Opp_Team_FAS)
Event_Dataset <- within(Event_Dataset, FMG_Diff <- Team_FMG - Opp_Team_FMG)
Event_Dataset <- within(Event_Dataset, FSH_Diff <- Team_FSH - Opp_Team_FSH)
Event_Dataset <- within(Event_Dataset, GC_Diff <- Team_GC - Opp_Team_GC)
Event_Dataset <- within(Event_Dataset, GRN_Diff <- Team_GRN - Opp_Team_GRN)
Event_Dataset <- within(Event_Dataset, GRS_Diff <- Team_GRS - Opp_Team_GRS)
Event_Dataset <- within(Event_Dataset, HAS_Diff <- Team_HAS - Opp_Team_HAS)
Event_Dataset <- within(Event_Dataset, HAT_Diff <- Team_HAT - Opp_Team_HAT)
Event_Dataset <- within(Event_Dataset, HER_Diff <- Team_HER - Opp_Team_HER)
Event_Dataset <- within(Event_Dataset, HKB_Diff <- Team_HKB - Opp_Team_HKB)
Event_Dataset <- within(Event_Dataset, HKS_Diff <- Team_HKS - Opp_Team_HKS)
Event_Dataset <- within(Event_Dataset, HOL_Diff <- Team_HOL - Opp_Team_HOL)
Event_Dataset <- within(Event_Dataset, HRN_Diff <- Team_HRN - Opp_Team_HRN)
Event_Dataset <- within(Event_Dataset, IMS_Diff <- Team_IMS - Opp_Team_IMS)
Event_Dataset <- within(Event_Dataset, INP_Diff <- Team_INP - Opp_Team_INP)
Event_Dataset <- within(Event_Dataset, ISR_Diff <- Team_ISR - Opp_Team_ISR)
Event_Dataset <- within(Event_Dataset, JCI_Diff <- Team_JCI - Opp_Team_JCI)
Event_Dataset <- within(Event_Dataset, JEN_Diff <- Team_JEN - Opp_Team_JEN)
Event_Dataset <- within(Event_Dataset, JJK_Diff <- Team_JJK - Opp_Team_JJK)
Event_Dataset <- within(Event_Dataset, JNG_Diff <- Team_JNG - Opp_Team_JNG)
Event_Dataset <- within(Event_Dataset, JON_Diff <- Team_JON - Opp_Team_JON)
Event_Dataset <- within(Event_Dataset, JRT_Diff <- Team_JRT - Opp_Team_JRT)
Event_Dataset <- within(Event_Dataset, KBM_Diff <- Team_KBM - Opp_Team_KBM)
Event_Dataset <- within(Event_Dataset, KEL_Diff <- Team_KEL - Opp_Team_KEL)
Event_Dataset <- within(Event_Dataset, KLK_Diff <- Team_KLK - Opp_Team_KLK)
Event_Dataset <- within(Event_Dataset, KMV_Diff <- Team_KMV - Opp_Team_KMV)
Event_Dataset <- within(Event_Dataset, KOS_Diff <- Team_KOS - Opp_Team_KOS)
Event_Dataset <- within(Event_Dataset, KPI_Diff <- Team_KPI - Opp_Team_KPI)
Event_Dataset <- within(Event_Dataset, KPK_Diff <- Team_KPK - Opp_Team_KPK)
Event_Dataset <- within(Event_Dataset, KRA_Diff <- Team_KRA - Opp_Team_KRA)
Event_Dataset <- within(Event_Dataset, LAB_Diff <- Team_LAB - Opp_Team_LAB)
Event_Dataset <- within(Event_Dataset, LMC_Diff <- Team_LMC - Opp_Team_LMC)
Event_Dataset <- within(Event_Dataset, LOG_Diff <- Team_LOG - Opp_Team_LOG)
Event_Dataset <- within(Event_Dataset, LYD_Diff <- Team_LYD - Opp_Team_LYD)
Event_Dataset <- within(Event_Dataset, LYN_Diff <- Team_LYN - Opp_Team_LYN)
Event_Dataset <- within(Event_Dataset, MAS_Diff <- Team_MAS - Opp_Team_MAS)
Event_Dataset <- within(Event_Dataset, MB_Diff <- Team_MB - Opp_Team_MB)
Event_Dataset <- within(Event_Dataset, MCL_Diff <- Team_MCL - Opp_Team_MCL)
Event_Dataset <- within(Event_Dataset, MGY_Diff <- Team_MGY - Opp_Team_MGY)
Event_Dataset <- within(Event_Dataset, MIC_Diff <- Team_MIC - Opp_Team_MIC)
Event_Dataset <- within(Event_Dataset, MKV_Diff <- Team_MKV - Opp_Team_MKV)
Event_Dataset <- within(Event_Dataset, MMG_Diff <- Team_MMG - Opp_Team_MMG)
Event_Dataset <- within(Event_Dataset, MOR_Diff <- Team_MOR - Opp_Team_MOR)
Event_Dataset <- within(Event_Dataset, MPI_Diff <- Team_MPI - Opp_Team_MPI)
Event_Dataset <- within(Event_Dataset, MSX_Diff <- Team_MSX - Opp_Team_MSX)
Event_Dataset <- within(Event_Dataset, MUZ_Diff <- Team_MUZ - Opp_Team_MUZ)
Event_Dataset <- within(Event_Dataset, MvG_Diff <- Team_MvG - Opp_Team_MvG)
Event_Dataset <- within(Event_Dataset, NOL_Diff <- Team_NOL - Opp_Team_NOL)
Event_Dataset <- within(Event_Dataset, NOR_Diff <- Team_NOR - Opp_Team_NOR)
Event_Dataset <- within(Event_Dataset, OCT_Diff <- Team_OCT - Opp_Team_OCT)
Event_Dataset <- within(Event_Dataset, OMY_Diff <- Team_OMY - Opp_Team_OMY)
Event_Dataset <- within(Event_Dataset, PEQ_Diff <- Team_PEQ - Opp_Team_PEQ)
Event_Dataset <- within(Event_Dataset, PGH_Diff <- Team_PGH - Opp_Team_PGH)
Event_Dataset <- within(Event_Dataset, PH_Diff <- Team_PH - Opp_Team_PH)
Event_Dataset <- within(Event_Dataset, PIG_Diff <- Team_PIG - Opp_Team_PIG)
Event_Dataset <- within(Event_Dataset, PKL_Diff <- Team_PKL - Opp_Team_PKL)
Event_Dataset <- within(Event_Dataset, PMC_Diff <- Team_PMC - Opp_Team_PMC)
Event_Dataset <- within(Event_Dataset, POM_Diff <- Team_POM - Opp_Team_POM)
Event_Dataset <- within(Event_Dataset, PPR_Diff <- Team_PPR - Opp_Team_PPR)
Event_Dataset <- within(Event_Dataset, PRR_Diff <- Team_PRR - Opp_Team_PRR)
Event_Dataset <- within(Event_Dataset, PTS_Diff <- Team_PTS - Opp_Team_PTS)
Event_Dataset <- within(Event_Dataset, RAG_Diff <- Team_RAG - Opp_Team_RAG)
Event_Dataset <- within(Event_Dataset, REI_Diff <- Team_REI - Opp_Team_REI)
Event_Dataset <- within(Event_Dataset, REN_Diff <- Team_REN - Opp_Team_REN)
Event_Dataset <- within(Event_Dataset, REW_Diff <- Team_REW - Opp_Team_REW)
Event_Dataset <- within(Event_Dataset, RIS_Diff <- Team_RIS - Opp_Team_RIS)
Event_Dataset <- within(Event_Dataset, RM_Diff <- Team_RM - Opp_Team_RM)
Event_Dataset <- within(Event_Dataset, ROG_Diff <- Team_ROG - Opp_Team_ROG)
Event_Dataset <- within(Event_Dataset, ROH_Diff <- Team_ROH - Opp_Team_ROH)
Event_Dataset <- within(Event_Dataset, RPI_Diff <- Team_RPI - Opp_Team_RPI)
Event_Dataset <- within(Event_Dataset, RSE_Diff <- Team_RSE - Opp_Team_RSE)
Event_Dataset <- within(Event_Dataset, RSL_Diff <- Team_RSL - Opp_Team_RSL)
Event_Dataset <- within(Event_Dataset, RT_Diff <- Team_RT - Opp_Team_RT)
Event_Dataset <- within(Event_Dataset, RTB_Diff <- Team_RTB - Opp_Team_RTB)
Event_Dataset <- within(Event_Dataset, RTH_Diff <- Team_RTH - Opp_Team_RTH)
Event_Dataset <- within(Event_Dataset, RTP_Diff <- Team_RTP - Opp_Team_RTP)
Event_Dataset <- within(Event_Dataset, RTR_Diff <- Team_RTR - Opp_Team_RTR)
Event_Dataset <- within(Event_Dataset, SAG_Diff <- Team_SAG - Opp_Team_SAG)
Event_Dataset <- within(Event_Dataset, SAP_Diff <- Team_SAP - Opp_Team_SAP)
Event_Dataset <- within(Event_Dataset, SAU_Diff <- Team_SAU - Opp_Team_SAU)
Event_Dataset <- within(Event_Dataset, SCR_Diff <- Team_SCR - Opp_Team_SCR)
Event_Dataset <- within(Event_Dataset, SE_Diff <- Team_SE - Opp_Team_SE)
Event_Dataset <- within(Event_Dataset, SEL_Diff <- Team_SEL - Opp_Team_SEL)
Event_Dataset <- within(Event_Dataset, SFX_Diff <- Team_SFX - Opp_Team_SFX)
Event_Dataset <- within(Event_Dataset, SGR_Diff <- Team_SGR - Opp_Team_SGR)
Event_Dataset <- within(Event_Dataset, SIM_Diff <- Team_SIM - Opp_Team_SIM)
Event_Dataset <- within(Event_Dataset, SMN_Diff <- Team_SMN - Opp_Team_SMN)
Event_Dataset <- within(Event_Dataset, SMS_Diff <- Team_SMS - Opp_Team_SMS)
Event_Dataset <- within(Event_Dataset, SP_Diff <- Team_SP - Opp_Team_SP)
Event_Dataset <- within(Event_Dataset, SPR_Diff <- Team_SPR - Opp_Team_SPR)
Event_Dataset <- within(Event_Dataset, SPW_Diff <- Team_SPW - Opp_Team_SPW)
Event_Dataset <- within(Event_Dataset, STF_Diff <- Team_STF - Opp_Team_STF)
Event_Dataset <- within(Event_Dataset, STH_Diff <- Team_STH - Opp_Team_STH)
Event_Dataset <- within(Event_Dataset, STM_Diff <- Team_STM - Opp_Team_STM)
Event_Dataset <- within(Event_Dataset, STR_Diff <- Team_STR - Opp_Team_STR)
Event_Dataset <- within(Event_Dataset, STS_Diff <- Team_STS - Opp_Team_STS)
Event_Dataset <- within(Event_Dataset, TBD_Diff <- Team_TBD - Opp_Team_TBD)
Event_Dataset <- within(Event_Dataset, TMR_Diff <- Team_TMR - Opp_Team_TMR)
Event_Dataset <- within(Event_Dataset, TOL_Diff <- Team_TOL - Opp_Team_TOL)
Event_Dataset <- within(Event_Dataset, TPR_Diff <- Team_TPR - Opp_Team_TPR)
Event_Dataset <- within(Event_Dataset, TRK_Diff <- Team_TRK - Opp_Team_TRK)
Event_Dataset <- within(Event_Dataset, TRP_Diff <- Team_TRP - Opp_Team_TRP)
Event_Dataset <- within(Event_Dataset, TSR_Diff <- Team_TSR - Opp_Team_TSR)
Event_Dataset <- within(Event_Dataset, TW_Diff <- Team_TW - Opp_Team_TW)
Event_Dataset <- within(Event_Dataset, UCS_Diff <- Team_UCS - Opp_Team_UCS)
Event_Dataset <- within(Event_Dataset, UPS_Diff <- Team_UPS - Opp_Team_UPS)
Event_Dataset <- within(Event_Dataset, USA_Diff <- Team_USA - Opp_Team_USA)
Event_Dataset <- within(Event_Dataset, WIL_Diff <- Team_WIL - Opp_Team_WIL)
Event_Dataset <- within(Event_Dataset, WLK_Diff <- Team_WLK - Opp_Team_WLK)
Event_Dataset <- within(Event_Dataset, WMR_Diff <- Team_WMR - Opp_Team_WMR)
Event_Dataset <- within(Event_Dataset, WMV_Diff <- Team_WMV - Opp_Team_WMV)
Event_Dataset <- within(Event_Dataset, WOB_Diff <- Team_WOB - Opp_Team_WOB)
Event_Dataset <- within(Event_Dataset, WOL_Diff <- Team_WOL - Opp_Team_WOL)
Event_Dataset <- within(Event_Dataset, WTE_Diff <- Team_WTE - Opp_Team_WTE)
Event_Dataset <- within(Event_Dataset, YAG_Diff <- Team_YAG - Opp_Team_YAG)
Event_Dataset <- within(Event_Dataset, ZAM_Diff <- Team_ZAM - Opp_Team_ZAM)

# Create additional Efficiency Difference variables
Event_Dataset <- within(Event_Dataset, Eff_L30_Diff <- (Team_OffRtgl30 - Team_DffRtgl30) - (Opp_Team_OffRtgl30 - Opp_Team_DffRtgl30))
Event_Dataset <- within(Event_Dataset, OEff_Diff <- Team_OffRtgl30 - Opp_Team_OffRtgl30)
Event_Dataset <- within(Event_Dataset, DEff_Diff <- Team_DffRtgl30 - Opp_Team_DffRtgl30)

# Haven't done anything with season records yet, so let's prep that here too
Event_Dataset <- within(Event_Dataset, Wins_Season <- as.numeric(gsub( "^.*-", "", Team_Record)))
Event_Dataset <- within(Event_Dataset, Losses_Season <- as.numeric(gsub( "-^.$", "", Team_Record)))
Event_Dataset <- within(Event_Dataset, Opp_Wins_Season <- as.numeric(gsub( "^.*-", "", Opp_Team_Record)))
Event_Dataset <- within(Event_Dataset, Opp_Losses_Season <- as.numeric(gsub( "-^.$", "", Opp_Team_Record)))
# Note that there are many NAs for records with blank values for Record. Defaulting these to 0 probably is not the best approach (initial testing found that the model tended to gravitate toward this as a proxy for a specific event, since it was so infrequent), so we'll set it to the mean in order to avoid it substantially biasing the model predictions.
Event_Dataset <- within(Event_Dataset, Wins_Season <- ifelse(is.na(Wins_Season), mean(Wins_Season, na.rm=T), Wins_Season))
Event_Dataset <- within(Event_Dataset, Losses_Season <- ifelse(is.na(Losses_Season), mean(Wins_Season, na.rm=T), Losses_Season))
Event_Dataset <- within(Event_Dataset, Opp_Wins_Season <- ifelse(is.na(Opp_Wins_Season), mean(Wins_Season, na.rm=T), Opp_Wins_Season))
Event_Dataset <- within(Event_Dataset, Opp_Losses_Season <- ifelse(is.na(Opp_Losses_Season), mean(Wins_Season, na.rm=T), Opp_Losses_Season))

# Create some tourney round variables to assess "pressure" situations if needed
Event_Dataset <- within(Event_Dataset, GameRound2 <- ifelse(GameRound == 2, 1, 0))
Event_Dataset <- within(Event_Dataset, GameRound3 <- ifelse(GameRound == 3, 1, 0))
Event_Dataset <- within(Event_Dataset, GameRound4 <- ifelse(GameRound == 4, 1, 0))
Event_Dataset <- within(Event_Dataset, GameRound5 <- ifelse(GameRound == 5, 1, 0))
Event_Dataset <- within(Event_Dataset, GameRound6 <- ifelse(GameRound == 6, 1, 0))
Event_Dataset <- within(Event_Dataset, GameRound_fct <- as.factor(GameRound))

# Set any NA values to 0 so that we can model on them still. Considered making this -999 or something so that they were more obvious...
Event_Dataset_no_NA_rm <- Event_Dataset
Event_Dataset[is.na(Event_Dataset)] <- 0
                                   
fwrite(Event_Dataset, "S1_Mens_Game_Level_Dataset_addlPrep.csv")                                   
                                