This report profiles a directory of 4,826 U.S. hospitals, drawn from a CMS-style facility file that records each hospital’s name, address, county, hospital type, ownership category, and whether it offers emergency services. The goal is descriptive: to characterize how American hospital care is organized structurally — by facility type, by who owns it, by whether it provides emergency care, and by where it is located — rather than to evaluate quality or outcomes, which this file does not contain.
hospitals <- read_csv("hospital-data.csv", col_types = cols(.default = "c"))
# Standardize a few obviously inconsistent fields before analysis
hospitals <- hospitals %>%
mutate(
`Hospital Ownership` = str_squish(str_replace_all(`Hospital Ownership`, "\\s*-\\s*", " - ")),
Ownership_Broad = case_when(
str_detect(`Hospital Ownership`, "Government") ~ "Government",
str_detect(`Hospital Ownership`, "Voluntary non-profit") ~ "Non-profit",
str_detect(`Hospital Ownership`, "Proprietary") ~ "Proprietary (for-profit)",
TRUE ~ "Other / Unclassified"
),
`Hospital Type` = str_squish(`Hospital Type`)
)
tibble(
Metric = c("Total hospitals", "Distinct hospital names", "States / territories represented",
"Distinct counties", "Distinct cities", "Rows missing a county value"),
Value = c(
comma(nrow(hospitals)),
comma(n_distinct(hospitals$`Hospital Name`)),
n_distinct(hospitals$State),
comma(n_distinct(hospitals$County, na.rm = TRUE)),
comma(n_distinct(hospitals$City)),
sum(is.na(hospitals$County))
)
) %>%
kable(caption = "Dataset snapshot") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
| Metric | Value |
|---|---|
| Total hospitals | 4,826 |
| Distinct hospital names | 4,624 |
| States / territories represented | 56 |
| Distinct counties | 1,532 |
| Distinct cities | 2,889 |
| Rows missing a county value | 21 |
The file is essentially complete for the fields that matter most to
this analysis — hospital type, ownership, and emergency-services status
are populated for every record. The only meaningful gap is
County, missing for 21 facilities (mostly VA medical
centers and a handful of hospitals in island territories).
Hospital Ownership also arrived with inconsistent spacing
and hyphenation (e.g. “Voluntary non-profit-Private”
vs. “Voluntary non-profit - Private”), which was standardized
before analysis, and a small number of duplicate hospital names exist
because health systems reuse names for facilities in different
cities.
type_summary <- hospitals %>%
count(`Hospital Type`, sort = TRUE) %>%
mutate(Share = percent(n / sum(n), accuracy = 0.1))
type_summary %>%
kable(col.names = c("Hospital Type", "Count", "Share of Total"),
caption = "Hospitals by type") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
| Hospital Type | Count | Share of Total |
|---|---|---|
| Acute Care Hospitals | 3491 | 72.3% |
| Critical Access Hospitals | 1184 | 24.5% |
| ACUTE CARE - VETERANS ADMINISTRATION | 129 | 2.7% |
| Childrens | 22 | 0.5% |
ggplot(type_summary, aes(x = fct_reorder(`Hospital Type`, n), y = n)) +
geom_col(fill = "#2c7fb8") +
geom_text(aes(label = comma(n)), hjust = -0.15, size = 3.5) +
coord_flip(clip = "off") +
scale_y_continuous(labels = comma, expand = expansion(mult = c(0, 0.15))) +
labs(title = "Hospital type distribution", x = NULL, y = "Number of hospitals") +
theme_minimal(base_size = 12)
General acute care hospitals dominate the file (72%), but Critical Access Hospitals — small, typically rural facilities capped at 25 beds under a separate Medicare payment designation — make up nearly a quarter (24.5%) of all listed hospitals. That is a substantial share, and it signals that this directory captures the long tail of small rural providers, not just large urban medical centers. VA-run acute care facilities (2.7%) and dedicated children’s hospitals (0.5%) round out the remainder.
hospitals %>%
count(`Hospital Ownership`, sort = TRUE) %>%
mutate(Share = percent(n / sum(n), accuracy = 0.1)) %>%
kable(col.names = c("Ownership Category (as recorded)", "Count", "Share"),
caption = "Hospitals by detailed ownership category") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE) %>%
scroll_box(height = "350px")
| Ownership Category (as recorded) | Count | Share |
|---|---|---|
| Voluntary non - profit - Private | 1683 | 34.9% |
| Proprietary | 817 | 16.9% |
| Voluntary non - profit - Other | 645 | 13.4% |
| Government - Hospital District or Authority | 528 | 10.9% |
| Voluntary non - profit - Church | 450 | 9.3% |
| Government - Local | 423 | 8.8% |
| Government Federal | 141 | 2.9% |
| Government - State | 70 | 1.5% |
| Government - Federal | 69 | 1.4% |
own_broad <- hospitals %>%
count(Ownership_Broad, sort = TRUE) %>%
mutate(Share = n / sum(n))
ggplot(own_broad, aes(x = "", y = n, fill = fct_reorder(Ownership_Broad, n))) +
geom_col(width = 1, color = "white") +
coord_polar(theta = "y") +
geom_text(aes(label = percent(Share, accuracy = 1)),
position = position_stack(vjust = 0.5), color = "white", fontface = "bold") +
scale_fill_brewer(palette = "Blues", direction = -1) +
labs(title = "Ownership structure, grouped", fill = NULL) +
theme_void(base_size = 12) +
theme(legend.position = "right")
Once the raw categories are grouped into their three natural buckets, the picture is clear: non-profit ownership is the backbone of the U.S. hospital system, accounting for roughly 58% of facilities when voluntary non-profit (private, church-affiliated, and “other”) categories are combined. Government-owned hospitals — spanning federal (including VA), state, and local/hospital-district authorities — account for about a quarter (25.5%), reflecting the large number of county and hospital-district facilities that serve as safety-net or rural providers. Proprietary, for-profit hospitals are the smallest of the three broad groups at 17%, though they are heavily concentrated in a handful of large multi-state systems and specific states (see the geographic section below).
hospitals %>%
filter(`Hospital Type` %in% c("Acute Care Hospitals", "Critical Access Hospitals")) %>%
count(`Hospital Type`, Ownership_Broad) %>%
group_by(`Hospital Type`) %>%
mutate(Share = percent(n / sum(n), accuracy = 1)) %>%
ungroup() %>%
pivot_wider(names_from = Ownership_Broad, values_from = c(n, Share)) %>%
kable(caption = "Ownership mix within the two largest hospital types") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
| Hospital Type | n_Government | n_Other / Unclassified | n_Proprietary (for-profit) | Share_Government | Share_Other / Unclassified | Share_Proprietary (for-profit) |
|---|---|---|---|---|---|---|
| Acute Care Hospitals | 647 | 2081 | 763 | 19% | 60% | 22% |
| Critical Access Hospitals | 454 | 677 | 53 | 38% | 57% | 4% |
Ownership mix varies meaningfully by facility type: Critical Access Hospitals skew government-owned (roughly 40% government vs. under 5% proprietary), consistent with their role as locally-supported rural anchors, while general acute care hospitals have a much larger for-profit presence, since large multi-state hospital corporations concentrate their facilities in this category.
er_summary <- hospitals %>%
count(`Emergency Services`, sort = TRUE) %>%
mutate(Share = percent(n / sum(n), accuracy = 0.1))
er_summary %>%
kable(col.names = c("Emergency Services", "Count", "Share"),
caption = "Emergency services status") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
| Emergency Services | Count | Share |
|---|---|---|
| Yes | 4572 | 94.7% |
| No | 231 | 4.8% |
| Not Available | 23 | 0.5% |
Emergency services are nearly universal (94.7% of hospitals report offering them), but 231 facilities (4.8%) explicitly do not, and another 23 have no status on record. The absence of emergency care is not evenly distributed:
hospitals %>%
filter(`Emergency Services` == "No") %>%
count(Ownership_Broad, sort = TRUE) %>%
mutate(Share = percent(n / sum(n), accuracy = 0.1)) %>%
kable(col.names = c("Ownership (broad)", "Hospitals w/o ER", "Share of no-ER hospitals"),
caption = "Which ownership types most often lack emergency services") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
| Ownership (broad) | Hospitals w/o ER | Share of no-ER hospitals |
|---|---|---|
| Proprietary (for-profit) | 99 | 42.9% |
| Other / Unclassified | 90 | 39.0% |
| Government | 42 | 18.2% |
hospitals %>%
count(`Hospital Type`, `Emergency Services`) %>%
group_by(`Hospital Type`) %>%
mutate(Share = n / sum(n)) %>%
filter(`Emergency Services` == "Yes") %>%
arrange(Share) %>%
kable(col.names = c("Hospital Type", "Emergency Services", "Count", "Share with ER"),
caption = "Share of each hospital type offering emergency services") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
| Hospital Type | Emergency Services | Count | Share with ER |
|---|---|---|---|
| Childrens | Yes | 20 | 0.9090909 |
| Acute Care Hospitals | Yes | 3265 | 0.9352621 |
| Critical Access Hospitals | Yes | 1158 | 0.9780405 |
| ACUTE CARE - VETERANS ADMINISTRATION | Yes | 129 | 1.0000000 |
Proprietary (for-profit) hospitals are disproportionately likely to operate without an emergency department — they account for 17% of all hospitals but 43% of hospitals lacking emergency services. This is consistent with a well-documented pattern in U.S. health care: many for-profit facilities are specialty or surgical hospitals (orthopedic, surgical, heart hospitals) that intentionally opt out of emergency care, which is typically a financial loss leader. Nearly every VA and children’s hospital in the file, by contrast, reports emergency services.
state_summary <- hospitals %>%
count(State, sort = TRUE) %>%
slice_max(n, n = 15)
ggplot(state_summary, aes(x = fct_reorder(State, n), y = n)) +
geom_col(fill = "#31a354") +
geom_text(aes(label = n), hjust = -0.3, size = 3.5) +
coord_flip(clip = "off") +
scale_y_continuous(expand = expansion(mult = c(0, 0.15))) +
labs(title = "Top 15 states by hospital count", x = NULL, y = "Number of hospitals") +
theme_minimal(base_size = 12)
Texas (376) and California (345) lead the country in raw hospital count, followed by a cluster of large and Midwestern states (New York, Florida, Illinois, Pennsylvania, Ohio). Texas’s total is notably inflated by its large number of small rural Critical Access and single-specialty proprietary hospitals rather than by population alone — a pattern worth flagging for anyone using this file to reason about access per capita, since this dataset contains no population denominator.
county_top <- hospitals %>%
filter(!is.na(County)) %>%
count(County, State, sort = TRUE) %>%
slice_max(n, n = 10)
city_top <- hospitals %>%
count(City, State, sort = TRUE) %>%
slice_max(n, n = 10)
county_top %>%
kable(col.names = c("County", "State", "Hospitals"), caption = "Top 10 counties by hospital count") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
| County | State | Hospitals |
|---|---|---|
| LOS ANGELES | CA | 86 |
| COOK | IL | 51 |
| HARRIS | TX | 41 |
| MARICOPA | AZ | 35 |
| DALLAS | TX | 28 |
| ORANGE | CA | 25 |
| MIAMI-DADE | FL | 22 |
| TARRANT | TX | 21 |
| CUYAHOGA | OH | 19 |
| OKLAHOMA | OK | 19 |
city_top %>%
kable(col.names = c("City", "State", "Hospitals"), caption = "Top 10 cities by hospital count") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
| City | State | Hospitals |
|---|---|---|
| CHICAGO | IL | 28 |
| HOUSTON | TX | 25 |
| LOS ANGELES | CA | 21 |
| DALLAS | TX | 18 |
| OKLAHOMA CITY | OK | 17 |
| PHILADELPHIA | PA | 17 |
| PHOENIX | AZ | 16 |
| BALTIMORE | MD | 15 |
| BROOKLYN | NY | 14 |
| NEW YORK | NY | 13 |
Los Angeles County alone accounts for 86 hospitals — more than double the next-largest county (Cook County, IL, home to Chicago) — underscoring how much hospital-count statistics are driven by a small number of very large, dense metro counties rather than reflecting typical local access.
The table below is fully searchable and sortable for readers who want to look up a specific hospital, state, or ownership type.
hospitals %>%
select(`Hospital Name`, City, State, County, `Hospital Type`, `Hospital Ownership`, `Emergency Services`) %>%
datatable(
options = list(pageLength = 10, scrollX = TRUE),
rownames = FALSE,
filter = "top"
)
This file describes hospital structure, not performance. It contains no bed counts, no patient volumes, no quality or outcome measures, and no population data — so it cannot support claims about care quality, capacity, or per-capita access on its own. It would pair well with CMS Hospital Compare quality measures or Census population data for that next layer of analysis.
Report generated in R Markdown. To publish: open this file in RStudio, click Knit, then use the Publish button (blue icon, top right of the preview) to push directly to RPubs.