Program set-up

Load Files

Center level data

Site level data

Data Dictionary

Step 1.1 Summarize UDS Data

Filter for relevant years and variables; create measures

d_center <- d2 %>%
  
  # Select relevant variables
  select(
    FILE = type_of_center, BHCMISID, GrantNumber, HealthCenterName, HealthCenterStreetAddress, HealthCenterState, HealthCenterZIPCode, year, starts_with("T4_L8")
    ) %>%
  
  # Select year 2021 and filter out US territories
  filter(
    year %in% 2021 &
    !(HealthCenterState %in% c("AS", "GU", "MP", "PR", "VI", "FM", "MH", "PW"))
    ) %>%
  
  # If value is missing, assume it is 0
  mutate(across(9:14,
         ~ifelse(is.na(.), 0, .))) %>%
  
  # Create measures
  mutate(
    SUBTOT_MCAID = `T4_L8a_Ca` + `T4_L8a_Cb`,
    SUBTOT_CHIP  = `T4_L8b_Ca` + `T4_L8b_Cb`,
    TOTAL_MCAIDCHIP = `T4_L8_Ca` + `T4_L8_Cb`
  )

Calculate number of sites per FQHC and merge onto the FQHC level data

n_sites <- d_site %>%
  
  # Filter for year 2021
  filter(year == 2021) %>%
  
  # Count the number of sites linked to each FQHC
  group_by(BHCMISID) %>%
  summarize(N_SITES = n())

# Merge the number of sites back onto the FQHC level data
d_center <- left_join(d_center, n_sites, by = "BHCMISID")

Data preview

Save FQHC file to DL

Counts of enrollees

# Using the FQHC level file: For H80s and LALs, count the number of Medicaid enrollees by state

counts_of_enrollees <- d_center %>%
  
  # Group by center type (H80/LAL) and state
  group_by(HealthCenterState, FILE) %>%
  
  # Sum up the total number of Medicaid enrollees
  summarize(n = sum(TOTAL_MCAIDCHIP)) %>%
  
  # Clean and format data
  pivot_wider(names_from = FILE, values_from = n) %>%
  
  # If a state/center type has no enrollees, it will automatically get coded as missing. I recode these values to 0.
  mutate(across(everything(), ~replace_na(., 0))) %>%
  
  # Create total number of enrollees across both types of centers
  mutate(TOTAL = `UDS H80` + `UDS LAL`)

Data preview

Save file to DL as “Count_of_Enrollees_[date].xlsx”

Count FQHCs and sites by state

# Using the FQHC level file: For H80s and LALs, count the number of Health Centers by state

count_of_HCs <- d_center %>%
  
  # Group by state and type of center
  group_by(HealthCenterState, FILE) %>%
  
  # Count the number of centers
  summarize(n = n()) %>%
  
  # Clean and format as before
  pivot_wider(names_from = FILE, values_from = n) %>%
  mutate(across(everything(), ~replace_na(., 0))) %>%
  
  # Sum up the total number of centers
  mutate(TOTAL = `UDS H80` + `UDS LAL`)

Data preview

Save file to DL as “Count_of_HCs_[date].xlsx”

Count of sites by center type and state

# Using the FQHC level file: For H80s and LALs, count the number of Health Centers Sites by state

count_of_sites <- d_center %>%
  
  # Group by state and type of center
  group_by(HealthCenterState, FILE) %>%
  
  # Count the number of centers
  summarize(n = sum(N_SITES)) %>%
  
  # Clean and format as before
  pivot_wider(names_from = FILE, values_from = n) %>%
  mutate(across(everything(), ~replace_na(., 0))) %>%
  
  # Sum up the total number of centers
  mutate(TOTAL = `UDS H80` + `UDS LAL`)

Data preview

Save file to DL as “Count_Sites_[date].xlsx”

Step 1.2 Extract IDs from UDS

List of NPIs

Read-in the public HRSA data that has administrative info on Health Centers

Filter public data, merge onto health center data, and generate unique list of NPIs

# Filter out US territories and select relevant variables
hrsa_public <- hrsa_public2 %>%
  filter(
    !(`Site State Abbreviation` %in% c("AS", "GU", "MP", "PR", "VI", "FM", "MH", "PW", "XX"))
  ) %>%
  select("GrantNumber" = "Health Center Number", "BHCMISID" = "BHCMIS Organization Identification Number", "NPI" = "FQHC Site NPI Number")

# Create a separate dataframe from Center level file with only relevant variables
health_center <- d_center %>%
  select(BHCMISID, HealthCenterState, TOTAL_MCAIDCHIP)

# Merge the HRSA public data onto health_center data by ID
m <- left_join(health_center, hrsa_public, by = "BHCMISID") %>%
  
  # Drop missing NPIs
  drop_na(NPI) %>%
  
  # Remove duplicate NPIs
  distinct(NPI, .keep_all = T) %>%
  
  # Turn NPI variable into characer and re-order variables
  mutate(NPI = as.character(NPI)) %>%
  select(BHCMISID, GrantNumber, everything())

Data preview

Save file to DL as “List_NPI_[Date].xlsx”

List of MedicaidNumbers

Filter site level data, merge onto health center data, and generate unique list of MedicaidNumbers

# Select relevant variables from Site level data and merge onto health center level data

d_site <- d_site %>%
  select(BHCMISID, GrantNumber, SiteState, MedicaidNumber, MedicaidPharmNumber)

merge <- left_join(d_site, health_center, by = "BHCMISID")

# Clean MedicaidNumbers
m <- merge %>%
  
  # If a center has multiple MedicaidNumbers (separated by "," or "/"), create new row for each number
  separate_rows(MedicaidNumber, sep = ",") %>%
  separate_rows(MedicaidNumber, sep = "/") %>%  
  
  # Filter out missing MedicaidNumbers
  filter(!(MedicaidNumber %in% c(NA, "NA", 0, "TBD", "pending", "not applicable", "n/a", "N/A", "none", "na", "None", "tbd", "*", "unk"))) %>%
  
  # Filter out MedicaidNumbers that are only 0s, Xs, or -s (e.g., "-------")
  filter(!str_detect(MedicaidNumber, "^[0]+$")) %>%
  filter(!str_detect(MedicaidNumber, "^[x]+$")) %>%
  filter(!str_detect(MedicaidNumber, "^[-]+$")) %>%
  
  # Remove "NPI" from MedicaidNumbers
  mutate(MedicaidNumber = str_replace(MedicaidNumber, "(?i)NPI", "")) %>%

  # Keep unique list of MedicaidNumbers
  distinct(MedicaidNumber, .keep_all = T) %>%
    
  # Remove rows that have no numbers
  filter(str_detect(MedicaidNumber, "\\d")) %>%
    
  # Remove rows that have 4 or more consecutive characters 
  filter(!str_detect(MedicaidNumber, "[[:alpha:]]{4,}")) %>%
    
  # Turn MedicaidNumber into character
  mutate(MedicaidNumber = as.character(MedicaidNumber)) %>%
    
  # Re-order variables
  select(BHCMISID, GrantNumber, HealthCenterState, TOTAL_MCAIDCHIP, MedicaidNumber)

Data preview

Save file to DL as “List_of_MedicaidNumber_[Date].xlsx”

List of MedicaidPharmNumbers

# Clean MedicaidPharmNumbers the same way as with MedicaidNumbers
m <- merge %>%
  separate_rows(MedicaidPharmNumber, sep = ",") %>%
  separate_rows(MedicaidPharmNumber, sep = "/") %>%  
  filter(!(MedicaidPharmNumber %in% c(NA, "NA", 0, "TBD", "pending", "not applicable", "n/a", "N/A", "none", "na", "None", "tbd", "*", "unk"))) %>%
  filter(!str_detect(MedicaidPharmNumber, "^[0]+$")) %>%
  filter(!str_detect(MedicaidPharmNumber, "^[x]+$")) %>%
  filter(!str_detect(MedicaidPharmNumber, "^[-]+$")) %>%
  mutate(MedicaidPharmNumber = str_replace(MedicaidPharmNumber, "(?i)NPI", "")) %>%
  distinct(MedicaidPharmNumber, .keep_all = T) %>%
  filter(str_detect(MedicaidPharmNumber, "\\d")) %>%
  filter(!str_detect(MedicaidPharmNumber, "[[:alpha:]]{4,}")) %>%
  mutate(MedicaidPharmNumber = as.character(MedicaidPharmNumber)) %>%
  select(BHCMISID, GrantNumber, HealthCenterState, TOTAL_MCAIDCHIP, MedicaidPharmNumber)

Data preview

Save file to DL as “List_of_MedicaidPharmNumber_[Date].xlsx”