library(tidyverse)

acs <- rio::import("https://github.com/marctrussler/IDS-Data/raw/main/ACSCountyData.csv", trust=T)

#A small dataset to merge in
income.rank <- data.frame(
  county.fips = acs$county.fips,
  income.rank = rank(-acs$median.income)
)

merged <- merge(acs, income.rank, by="county.fips")
head(merged[,c("county.name","median.income","income.rank")])

# #Keep all rows from x even if no match in y
# merge(x, y, by="id", all.x=TRUE)

x <- 10

if(x > 5){
  print("Big")
} else if(x > 0){
  print("Small but positive")
} else {
  print("Negative or zero")
}

standardize <- function(x){
  z <- (x - mean(x, na.rm=T))/sd(x, na.rm=T)
  return(z)
}

#Test it
standardize(c(1,2,3,4,5))

trim.mean <- function(x, trim=0.1){
  return(mean(x, trim=trim, na.rm=T))
}

trim.mean(acs$median.income)
trim.mean(acs$median.income, trim=0.25)

#Simulate one round where you switch
monty.switch <- function(){
  doors <- c("car","goat","goat")
  doors <- sample(doors)
  pick <- 1
  reveal <- which(doors=="goat" & 1:3 != pick)[1]
  switch.to <- which(1:3 != pick & 1:3 != reveal)
  return(doors[switch.to]=="car")
}

results <- rep(NA, 10000)
for(i in 1:10000){
  results[i] <- monty.switch()
}
mean(results)

library(tidyverse)

#filter() keeps rows
acs |>
  filter(state.full=="Pennsylvania") |>
  head()

#select() keeps columns
acs |>
  select(county.name, state.full, median.income) |>
  head()

#mutate() creates or modifies columns
acs |>
  mutate(income.k = median.income/1000) |>
  select(county.name, income.k) |>
  head()

#arrange() sorts
acs |>
  arrange(desc(median.income)) |>
  select(county.name, median.income) |>
  head()

#group_by() + summarize() collapses data
acs |>
  group_by(census.region) |>
  summarize(mean.income = mean(median.income, na.rm=T))

#distinct() returns unique values
acs |>
  distinct(state.full) |>
  head()

acs |>
  select(starts_with("percent")) |>
  head()

# left_join(acs, income.rank, by="county.fips")
# inner_join(acs, income.rank, by="county.fips")

acs |>
  mutate(income.cat = case_when(
    median.income < 40000 ~ "Low",
    median.income < 70000 ~ "Middle",
    .default = "High"
  )) |>
  count(income.cat)

acs |>
  mutate(across(c(median.income, percent.white, percent.senior), \(x) (x-mean(x, na.rm=T))/sd(x,na.rm=T))) |>
  select(median.income, percent.white, percent.senior) |>
  head()

elect <- rio::import("https://github.com/marctrussler/IDS-Data/raw/main/VizData.Rds")

ggplot(elect, aes(x = p.white, y = plean.20)) +
  geom_point()

ggplot(elect, aes(x = p.white, y = plean.20)) +
  geom_point(alpha = 0.3) +
  geom_smooth(method = "lm", color = "firebrick")

elect |>
  filter(!is.na(plean.20)) |>
  group_by(region) |>
  summarize(mean.lean = mean(plean.20)) |>
  ggplot(aes(x = region, y = mean.lean)) +
  geom_col(fill = "steelblue")

# #Color varies by a variable
# geom_point(aes(color = region))
# 
# #Color is fixed for all points
# geom_point(color = "steelblue")

m1 <- lm(median.income ~ percent.white, data=acs)
summary(m1)

plot(acs$percent.white, acs$median.income,
     xlab="Percent White", ylab="Median Income",
     pch=16, col=rgb(0,0,0,0.2))
abline(m1, col="firebrick", lwd=2)

acs$urban <- ifelse(acs$population > 250000, 1, 0)
m2 <- lm(median.income ~ urban, data=acs)
coef(m2)

acs$rich <- ifelse(acs$median.income > 70000, 1, 0)
m3 <- lm(rich ~ percent.white, data=acs)
coef(m3)

m4 <- lm(median.income ~ percent.white + percent.college, data=acs)
summary(m4)

m5 <- lm(median.income ~ as.factor(census.region), data=acs)
summary(m5)

acs$region.f <- relevel(as.factor(acs$census.region), ref="south")
m6 <- lm(median.income ~ region.f, data=acs)
coef(m6)

sd.college.effect <- coef(m4)["percent.college"] *
                    sd(acs$percent.college, na.rm=T)
sd.college.effect
sd.white.effect <- coef(m4)["percent.white"] *
                    sd(acs$percent.white, na.rm=T)
sd.white.effect

