A couple weeks ago I shared an #rstats script to track global coronavirus cases by country.

The New York Times also released COVID-19 data for new cases in the United States, both at the state and county level. You can run the code below on a daily basis to get the most up to date figures.

Feel free to modify for your own needs:

library(scales)
library(tidyverse)
library(gghighlight)

state <- read_csv("https://raw.githubusercontent.com/nytimes/covid-19-data/master/us-states.csv")
county <- read_csv("https://raw.githubusercontent.com/nytimes/covid-19-data/master/us-counties.csv")

State

state %>%
  group_by(date, state) %>%
  mutate(total_cases = cumsum(cases)) %>%
  ungroup() %>%
  filter(total_cases >= 100) %>% # MINIMUM 100 CASES
  group_by(state) %>%
  mutate(day_index = row_number(),
         n = n()) %>%
  ungroup() %>%
  filter(n >= 12) %>% # MINIMUM 12 DAYS
  ggplot(aes(day_index, total_cases, color = state, fill = state)) +
  geom_point() +
  geom_smooth() +
  gghighlight() +
  scale_y_log10(labels = comma_format()) +
  facet_wrap(~state, ncol = 4) +
  labs(title = "COVID-19: cumulative daily new cases by US states (log scale)",
       x = "Days since 100th reported case",
       y = NULL, fill = NULL, color = NULL, 
       caption = "by: @eeysirhc\nSource: New York Times") +
  theme_minimal() +
  theme(legend.position = 'none') +
  expand_limits(x = 30)

County

For the county level, we’ll focus only on California:

county %>%
  filter(state == 'California') %>%
  group_by(date, county) %>%
  mutate(total_cases = cumsum(cases)) %>%
  ungroup() %>%
  filter(total_cases >= 50) %>% # MINIMUM 50 CASES
  group_by(county) %>%
  mutate(day_index = row_number(),
         n = n()) %>%
  ungroup() %>%
  ggplot(aes(day_index, total_cases, color = county, fill = county)) +
  geom_point() +
  geom_smooth() +
  gghighlight() +
  scale_y_log10(labels = comma_format()) +
  facet_wrap(~county, ncol = 4) +
  labs(title = "COVID-19: cumulative daily new cases by California counties (log scale)",
       x = "Days since 50th reported case",
       y = NULL, fill = NULL, color = NULL, 
       caption = "by: @eeysirhc\nSource: New York Times") +  
  theme_minimal() +
  theme(legend.position = 'none')