rm(list=ls(all=TRUE))
best <- function(state, outcome) {
## Read outcome data
df <- read.csv("outcome-of-care-measures.csv", na.strings="Not Available",stringsAsFactors=FALSE, colClasses = "character")
## Check that state and outcome arguments are valid
if ((state %in% df$State == TRUE) && (outcome %in% c("heart attack","heart failure","pneumonia") == TRUE)) {
outcomes <- c("heart attack"=11, "heart failure"=17, "pneumonia"=23)
# Get df columns 2, 7, and the numerical equivalent of outcome according to the 'outcomes' vector.
my_df <- df[,c(2,7,outcomes[outcome])]
# Set the column names for the subsetted dataframe, 'my_df'
names(my_df) <- c("Hospital", "State", "Mortality_Rate")
# Filter the 'my_df' rows on state
my_df <- my_df[my_df$State==state,]
# Eliminate any rows with NA values
my_df <- my_df[complete.cases(my_df),]
# Convert the 'Mortality_Rate' column to a numeric variable type
my_df$Mortality_Rate <- as.numeric(unlist(my_df$Mortality_Rate))
# Sort 'my_df' first by "Mortality Rate" ascending, then by "Hospital"
my_df <- my_df[with (my_df, order(Mortality_Rate,Hospital)),]
## Return hospital name in that state with lowest 30-day death rate
result <- my_df[1,1]
# Error handling for incorrect inputs.
} else {
ifelse(state %in% df$State == FALSE,stop("invalid state"),stop("invalid outcome"))
# Alternate code to generate error messages for invalid inputs
#if (state %in% df$State == FALSE) { # generate error message for invalid state input
#stop("invalid state")
#} else {
# stop("invalid outcome") # generate error message for invalid outcome input
# }
}
result
}
best("AK","heart failure")
## [1] "SOUTH PENINSULA HOSPITAL"
best("SC","heart attack")
## [1] "MUSC MEDICAL CENTER"
best("NY","pneumonia")
## [1] "MAIMONIDES MEDICAL CENTER"
best("AK","pneumonia")
## [1] "YUKON KUSKOKWIM DELTA REG HOSPITAL"
rankhospital <- function(state, outcome,num="best") {
## Read outcome data
df <- read.csv("outcome-of-care-measures.csv", na.strings="Not Available",stringsAsFactors=FALSE, colClasses = "character")
## Check that state and outcome arguments are valid
if ((state %in% df$State == TRUE) && (outcome %in% c("heart attack","heart failure","pneumonia") == TRUE)) {
outcomes <- c("heart attack"=11, "heart failure"=17, "pneumonia"=23)
# Get df columns 2, 7, and the numerical equivalent of outcome according to the 'outcomes' vector.
my_df <- df[,c(2,7,outcomes[outcome])]
# Set the column names for the subsetted dataframe, 'my_df'
names(my_df) <- c("Hospital", "State", "Mortality_Rate")
# Filter the 'my_df' rows on state
my_df <- my_df[my_df$State==state,]
# Eliminate any rows with NA values
my_df <- my_df[complete.cases(my_df),]
# Convert the 'Mortality_Rate' column to a numeric variable type
my_df$Mortality_Rate <- as.numeric(unlist(my_df$Mortality_Rate))
# Sort 'my_df' first by "Mortality Rate" ascending, then by "Hospital"
my_df <- my_df[with (my_df, order(Mortality_Rate,Hospital)),]
# Add rank column to 'my_df'. In case of tie in 'Mortality_Value' numbers, first value wins.
my_df$Rank <- rank(my_df$Mortality_Rate,ties.method= "first")
# Develop logic if user enters "best" or "worst" for 'num' argument.
rownum <- integer()
if (num =="best") {
rownum = 1
} else {
if (num == "worst") {
rownum = nrow(my_df)
} else {
rownum=num
}
}
## Return hospital name in that state with lowest 30-day death rate
result <- my_df[rownum,1]
# Error handling for incorrect inputs.
} else {
ifelse(state %in% df$State == FALSE,stop("invalid state"),stop("invalid outcome"))
# Alternate code to generate error messages for invalid inputs
#if (state %in% df$State == FALSE) { # generate error message for invalid state input
#stop("invalid state")
#} else {
# stop("invalid outcome") # generate error message for invalid outcome input
# }
}
result
}
rankhospital("NC","heart attack","worst")
## [1] "WAYNE MEMORIAL HOSPITAL"
rankhospital("WA","heart attack",7)
## [1] "YAKIMA VALLEY MEMORIAL HOSPITAL"
rankhospital("TX","pneumonia",10)
## [1] "SETON SMITHVILLE REGIONAL HOSPITAL"
rankhospital("NY","heart attack",7)
## [1] "BELLEVUE HOSPITAL CENTER"
rankall <- function(outcome, num = "best") {
## Read outcome data
## Check that state and outcome are valid
## For each state, find the hospital of the given rank
## Return a data frame with the hospital names and the
## (abbreviated) state name
#Make list of possible values of outcome and their index
possible.outcomes <- list("heart attack" = 11, "heart failure" = 17, "pneumonia" = 23)
outcome.col <- possible.outcomes[[outcome]]
#Stop if outcome was not in possible.outcomes
if (is.null(outcome.col))
stop("invalid outcome")
#Read the csv
raw_df <- read.csv("outcome-of-care-measures.csv", colClasses = "character")
#Convert the desired column to numeric
raw_df[, outcome.col] <- suppressWarnings(sapply(raw_df[, outcome.col], as.numeric))
#Make data.frame for all states
working_df <- subset(raw_df, select = c(outcome.col,2, 7))
# Set the column names for the subsetted dataframe, 'working_df'
names(working_df) <- c("Mortality_Rate","Hospital", "State")
# Eliminate any rows with NA values
working_df <- working_df[complete.cases(working_df),]
# Split the 'working_df' into dataframes grouped by State
split_df <- split(working_df, working_df$State)
staterank <- function(working_df) {
#Make list of positions
rank.list <- order(working_df$Mortality_Rate,working_df$Hospital, na.last = NA)
#Check validity of num argument and assign numeric value
if (num == "best")
num <- 1
else if (num == "worst")
num <- length(rank.list)
else if (!is.numeric(num))
stop("Unrecognised num argument")
working_df[rank.list[num],2]
}
ranked.states <- data.frame(sapply(split_df, staterank))
ranked.states <- data.frame(ranked.states, row.names(ranked.states))
names(ranked.states) <- c("Hospital", "State")
ranked.states
}
rankall("heart attack","best")
## Hospital State
## AK PROVIDENCE ALASKA MEDICAL CENTER AK
## AL CRESTWOOD MEDICAL CENTER AL
## AR ARKANSAS HEART HOSPITAL AR
## AZ MAYO CLINIC HOSPITAL AZ
## CA GLENDALE ADVENTIST MEDICAL CENTER CA
## CO ST MARYS HOSPITAL AND MEDICAL CENTER CO
## CT WATERBURY HOSPITAL CT
## DC PROVIDENCE HOSPITAL DC
## DE BAYHEALTH - KENT GENERAL HOSPITAL DE
## FL MOUNT SINAI MEDICAL CENTER FL
## GA STEPHENS COUNTY HOSPITAL GA
## GU GUAM MEMORIAL HOSPITAL AUTHORITY GU
## HI HILO MEDICAL CENTER HI
## IA MARY GREELEY MEDICAL CENTER IA
## ID PORTNEUF MEDICAL CENTER ID
## IL SAINT JOSEPH HOSPITAL IL
## IN ST VINCENT HEART CENTER OF INDIANA LLC IN
## KS KANSAS HEART HOSPITAL KS
## KY ST ELIZABETH MEDICAL CENTER NORTH KY
## LA ST FRANCIS MEDICAL CENTER LA
## MA BETH ISRAEL DEACONESS MEDICAL CENTER MA
## MD JOHNS HOPKINS HOSPITAL, THE MD
## ME YORK HOSPITAL ME
## MI MUNSON MEDICAL CENTER MI
## MN ST MARYS HOSPITAL MN
## MO BOONE HOSPITAL CENTER MO
## MS WESLEY MEDICAL CENTER MS
## MT BENEFIS HOSPITALS INC MT
## NC CAROLINAS MEDICAL CENTER-NORTHEAST NC
## ND SANFORD MEDICAL CENTER FARGO ND
## NE FAITH REGIONAL HEALTH SERVICES NE
## NH CATHOLIC MEDICAL CENTER NH
## NJ EAST ORANGE GENERAL HOSPITAL NJ
## NM ST VINCENT HOSPITAL NM
## NV SUNRISE HOSPITAL AND MEDICAL CENTER NV
## NY NYU HOSPITALS CENTER NY
## OH JEWISH HOSPITAL, LLC OH
## OK OKLAHOMA HEART HOSPITAL SOUTH OK
## OR PORTLAND VA MEDICAL CENTER OR
## PA DOYLESTOWN HOSPITAL PA
## PR HOSPITAL DR CAYETANO COLL Y TOSTE PR
## RI MIRIAM HOSPITAL RI
## SC MUSC MEDICAL CENTER SC
## SD AVERA HEART HOSPITAL OF SOUTH DAKOTA LLC SD
## TN METHODIST MEDICAL CENTER OF OAK RIDGE TN
## TX CYPRESS FAIRBANKS MEDICAL CENTER TX
## UT DIXIE REGIONAL MEDICAL CENTER UT
## VA CHESAPEAKE REGIONAL MEDICAL CENTER VA
## VI ROY LESTER SCHNEIDER HOSPITAL,THE VI
## VT FLETCHER ALLEN HOSPITAL OF VERMONT VT
## WA PROVIDENCE SACRED HEART MEDICAL CENTER WA
## WI BELLIN MEMORIAL HSPTL WI
## WV MONONGALIA COUNTY GENERAL HOSPITAL WV
## WY WYOMING MEDICAL CENTER WY
r <- rankall("heart attack", 4)
as.character(subset(r, State == "HI")$Hospital)
## [1] "CASTLE MEDICAL CENTER"
r <- rankall("pneumonia", "worst")
as.character(subset(r, State == "NJ")$Hospital)
## [1] "BERGEN REGIONAL MEDICAL CENTER"
r <- rankall("heart failure", 10)
as.character(subset(r, State == "NV")$Hospital)
## [1] "RENOWN SOUTH MEADOWS MEDICAL CENTER"