Question 1
#View data set
outcome <- read.csv("data/outcome-of-care-measures.csv", colClasses = "character")
head(outcome)
dim(outcome)
[1] 4706 46

best <- function(state = 'tx', outcome = 'heart attack'){
#Clean up white space
state <- toupper(trimws(state))
outcome <- tolower(trimws(outcome))
#bestFx() is a helper function with various methods
bestObj <- bestFx()
#Read outcome data
df <- bestObj$getData()
#Check that state and outcome are valid
states <- bestObj$states() #get all states
outcomes <- bestObj$outcome() #get all possible outcomes:heart attack, heart...
if(!state %in% states){
stop("Invalid state!", call. = FALSE)
}
if(!outcome %in% outcomes){
stop("Invalid outcome!", call. = FALSE)
}
#bestHosp: function to return hospital name in the state with lowest 30-day death rate
bestObj$bestHosp(df, state, outcome) #
}
best('TX', 'heart failure')
[1] "FORT DUNCAN MEDICAL CENTER"
best('NY', 'hert attack')
Error: Invalid outcome!
best('md', 'pneumonia')
[1] "GREATER BALTIMORE MEDICAL CENTER"
best('kd', 'pneumonia')
Error: Invalid state!

#####################################################################################
# Function name: rankHospital()
# - function to return hospital name in the state with the given rank
# - Inputs: state, outcome, rank
# - Output: -hospital name
#####################################################################################
rankHospital <- function(state1 = 'TX', outcome = 'heart attack', rank = c('best', 'worst')){
state1 <- toupper(trimws(state1))
outcome <- tolower(trimws(outcome))
rank <- rank[1]
#Convert rank to lower case, trim white space
if(is.character(rank)){
rank <- trimws(tolower(rank))
}
#Read in data
bestObj <- bestFx()
df <- bestObj$getData()
#Check validity of state
states = bestObj$states()
if(!state1 %in% states){
stop("Invalid State!", call. = FALSE)
}
#Check validity of outcome
outcomes <- bestObj$outcome()
if(!outcome %in% outcomes){
stop("Invalid Outcome!", call. = FALSE)
}
#Filter for appropriate state
df <- df %>%
filter(state == state1) %>%
select(hospital, all_of(outcome), state) %>% #https://tidyselect.r-lib.org/reference/faq-external-vector.html
drop_na(all_of(outcome)) #Remove NAs from outcome column
n <- dim(df)[1] #number of rows in dataset
ranks <- seq(n) #ranks of each hospital in data set
if(rank == 'best'){
rank <- 1
}
if(rank == 'worst'){
rank <- n
}
if (rank > n){
return(NA)
}
#sort by outcome then by hospital name
df <- df[order(df[, 2], df[, 1]), ] %>%
cbind(ranks) #add column to dataframe df
df[rank, ]$hospital #get name of hospital
}
rankHospital(' tx', 'heart failure', 4)
[1] "DETAR HOSPITAL NAVARRO"
rankHospital('md', 'heart attack', 'worst')
[1] "HARFORD MEMORIAL HOSPITAL"
rankHospital('mn ', 'heart attack', 5000)
[1] NA
rankHospital('m n ', 'heart attack', 10)
Error: Invalid State!
rankHospital('mn ', 'heart attack', 10)
[1] "VIRGINIA REGIONAL MEDICAL CENTER"

rankall <- function(outcome = "heart attack", rank = 'best'){
## Read data
bestObj <- bestFx()
df <- bestObj$getData()
##Check that outcome is valid
outcome <- trimws(tolower(outcome))
outcomes <- bestObj$outcome() #Get list of outcomes
if(!outcome %in% outcomes){
stop("Invalid input!")
}
##For each state, find the hospital of the given rank
states <- sort(bestObj$states())
#Create empty dataframe
d_f <- data.frame(hospital = character(),
state = character(),
stringsAsFactors = FALSE)
for (state in states){
#getHosp(): returns data frame with hospital and state as columns
temp <- bestObj$getHosp(df, state, outcome, rank)
d_f <- rbind(d_f, temp)
}
d_f
}
rankall('heart attack', 20)
tail(rankall('pneumonia' ,'worst'), 3)
tail(rankall('heart failure' ), 10)
LS0tDQp0aXRsZTogIlByb2dyYW1taW5nIEFzc2lnbm1lbnQgMyINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCg0KDQojIyMjIElOVFJPRFVDVElPTg0KDQpgYGB7ciBpbnRybywgZWNobz1GQUxTRX0NCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCdpbnRyby5qcGcnKQ0KYGBgDQoNCiAgIA0KKipMT0FEIEhFTFBFUiBGVU5DVElPTlMqKg0KDQpgYGB7cn0NCiMjSGVscGVyIGZ1bmN0aW9ucw0KbGlicmFyeSh0aWR5dmVyc2UpDQpzb3VyY2UoJ2hlbHBlcl9mdW5jdGlvbnMuUicpDQpgYGANCg0KIyMjIyBRdWVzdGlvbiAxDQpgYGB7cn0NCiNWaWV3IGRhdGEgc2V0DQoNCm91dGNvbWUgPC0gcmVhZC5jc3YoImRhdGEvb3V0Y29tZS1vZi1jYXJlLW1lYXN1cmVzLmNzdiIsIGNvbENsYXNzZXMgPSAiY2hhcmFjdGVyIikNCg0KaGVhZChvdXRjb21lKQ0KYGBgDQoNCmBgYHtyfQ0KZGltKG91dGNvbWUpDQpgYGANCg0KDQpgYGB7ciBxdWVzMiwgZWNobz1GQUxTRX0NCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCdxdWVzMi5qcGcnKQ0KYGBgDQoNCg0KDQpgYGB7cn0NCg0KYmVzdCA8LSBmdW5jdGlvbihzdGF0ZSA9ICd0eCcsIG91dGNvbWUgPSAnaGVhcnQgYXR0YWNrJyl7DQogICNDbGVhbiB1cCB3aGl0ZSBzcGFjZQ0KICBzdGF0ZSA8LSB0b3VwcGVyKHRyaW13cyhzdGF0ZSkpIA0KICBvdXRjb21lIDwtIHRvbG93ZXIodHJpbXdzKG91dGNvbWUpKQ0KICANCiAgI2Jlc3RGeCgpIGlzIGEgaGVscGVyIGZ1bmN0aW9uIHdpdGggdmFyaW91cyBtZXRob2RzDQogIGJlc3RPYmogPC0gYmVzdEZ4KCkNCiAgDQogICNSZWFkIG91dGNvbWUgZGF0YQ0KICBkZiA8LSBiZXN0T2JqJGdldERhdGEoKQ0KICANCiAgI0NoZWNrIHRoYXQgc3RhdGUgYW5kIG91dGNvbWUgYXJlIHZhbGlkDQogIHN0YXRlcyA8LSBiZXN0T2JqJHN0YXRlcygpICNnZXQgYWxsIHN0YXRlcw0KICBvdXRjb21lcyA8LSBiZXN0T2JqJG91dGNvbWUoKSAjZ2V0IGFsbCBwb3NzaWJsZSBvdXRjb21lczpoZWFydCBhdHRhY2ssIGhlYXJ0Li4uDQogIA0KICBpZighc3RhdGUgJWluJSBzdGF0ZXMpew0KICAgIHN0b3AoIkludmFsaWQgc3RhdGUhIiwgY2FsbC4gPSBGQUxTRSkNCiAgfQ0KICANCiAgaWYoIW91dGNvbWUgJWluJSBvdXRjb21lcyl7DQogICAgc3RvcCgiSW52YWxpZCBvdXRjb21lISIsIGNhbGwuID0gRkFMU0UpDQogICAgDQogIH0NCiAgDQogICNiZXN0SG9zcDogZnVuY3Rpb24gdG8gcmV0dXJuIGhvc3BpdGFsIG5hbWUgaW4gdGhlIHN0YXRlIHdpdGggbG93ZXN0IDMwLWRheSBkZWF0aCByYXRlDQogIGJlc3RPYmokYmVzdEhvc3AoZGYsIHN0YXRlLCBvdXRjb21lKSAjDQogIA0KfQ0KDQpgYGANCg0KYGBge3J9DQpiZXN0KCdUWCcsICdoZWFydCBmYWlsdXJlJykNCmBgYA0KDQoNCmBgYHtyfQ0KDQpiZXN0KCdOWScsICdoZXJ0IGF0dGFjaycpDQoNCmBgYA0KDQpgYGB7cn0NCmJlc3QoJ21kJywgJ3BuZXVtb25pYScpDQoNCmBgYA0KDQpgYGB7cn0NCmJlc3QoJ2tkJywgJ3BuZXVtb25pYScpDQpgYGANCg0KDQoNCmBgYHtyIHF1ZXMzLCBlY2hvPUZBTFNFfQ0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoJ3F1ZXMzLmpwZycpDQoNCmBgYA0KDQoNCmBgYHtyfQ0KDQogICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiAgIyBGdW5jdGlvbiBuYW1lOiByYW5rSG9zcGl0YWwoKQ0KICAjIC0gZnVuY3Rpb24gdG8gcmV0dXJuIGhvc3BpdGFsIG5hbWUgaW4gdGhlIHN0YXRlIHdpdGggdGhlIGdpdmVuIHJhbmsNCiAgIyAtIElucHV0czogc3RhdGUsIG91dGNvbWUsIHJhbmsNCiAgIyAtIE91dHB1dDogLWhvc3BpdGFsIG5hbWUNCiAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KICByYW5rSG9zcGl0YWwgPC0gZnVuY3Rpb24oc3RhdGUxID0gJ1RYJywgb3V0Y29tZSA9ICdoZWFydCBhdHRhY2snLCByYW5rID0gYygnYmVzdCcsICd3b3JzdCcpKXsNCiAgICANCiAgICAgIHN0YXRlMSA8LSB0b3VwcGVyKHRyaW13cyhzdGF0ZTEpKSANCiAgICAgIG91dGNvbWUgPC0gdG9sb3dlcih0cmltd3Mob3V0Y29tZSkpDQogIA0KICAgICAgcmFuayA8LSByYW5rWzFdDQogICAgICANCiAgICAgICNDb252ZXJ0IHJhbmsgdG8gbG93ZXIgY2FzZSwgdHJpbSB3aGl0ZSBzcGFjZQ0KICAgICAgaWYoaXMuY2hhcmFjdGVyKHJhbmspKXsNCiAgICAgICAgcmFuayA8LSB0cmltd3ModG9sb3dlcihyYW5rKSkNCiAgICAgIH0NCiAgICAgIA0KICAgICAgI1JlYWQgaW4gZGF0YQ0KICAgICAgYmVzdE9iaiA8LSBiZXN0RngoKSANCiAgICAgIGRmIDwtIGJlc3RPYmokZ2V0RGF0YSgpDQogICAgDQogICAgICAjQ2hlY2sgdmFsaWRpdHkgb2Ygc3RhdGUNCiAgICAgIHN0YXRlcyA9IGJlc3RPYmokc3RhdGVzKCkNCiAgICAgIA0KICAgICAgaWYoIXN0YXRlMSAlaW4lIHN0YXRlcyl7DQogICAgICAgIHN0b3AoIkludmFsaWQgU3RhdGUhIiwgY2FsbC4gPSBGQUxTRSkNCiAgICAgIH0NCiAgICAgIA0KICAgICAgI0NoZWNrIHZhbGlkaXR5IG9mIG91dGNvbWUNCiAgICAgIG91dGNvbWVzIDwtIGJlc3RPYmokb3V0Y29tZSgpDQogICAgICBpZighb3V0Y29tZSAlaW4lIG91dGNvbWVzKXsNCiAgICAgICAgc3RvcCgiSW52YWxpZCBPdXRjb21lISIsIGNhbGwuID0gRkFMU0UpDQogICAgICB9DQogICAgICANCiAgICAgICNGaWx0ZXIgZm9yIGFwcHJvcHJpYXRlIHN0YXRlDQogICAgICBkZiA8LSBkZiAlPiUNCiAgICAgICAgZmlsdGVyKHN0YXRlID09IHN0YXRlMSkgJT4lDQogICAgICAgIHNlbGVjdChob3NwaXRhbCwgYWxsX29mKG91dGNvbWUpLCBzdGF0ZSkgJT4lICAjaHR0cHM6Ly90aWR5c2VsZWN0LnItbGliLm9yZy9yZWZlcmVuY2UvZmFxLWV4dGVybmFsLXZlY3Rvci5odG1sDQogICAgICAgIGRyb3BfbmEoYWxsX29mKG91dGNvbWUpKSAjUmVtb3ZlIE5BcyBmcm9tIG91dGNvbWUgY29sdW1uDQogICAgICANCiAgICAgIG4gPC0gZGltKGRmKVsxXSAjbnVtYmVyIG9mIHJvd3MgaW4gZGF0YXNldA0KICAgICAgDQogICAgICByYW5rcyA8LSBzZXEobikgI3JhbmtzIG9mIGVhY2ggaG9zcGl0YWwgaW4gZGF0YSBzZXQNCiAgICAgIA0KICAgICAgaWYocmFuayA9PSAnYmVzdCcpew0KICAgICAgICByYW5rIDwtIDENCiAgICAgIH0NCiAgICAgIGlmKHJhbmsgPT0gJ3dvcnN0Jyl7DQogICAgICAgIHJhbmsgPC0gbg0KICAgICAgfSANCiAgICAgIGlmIChyYW5rID4gbil7DQogICAgICAgIHJldHVybihOQSkNCiAgICAgIH0NCiAgICAgIA0KICAgICAgI3NvcnQgYnkgb3V0Y29tZSB0aGVuIGJ5IGhvc3BpdGFsIG5hbWUNCiAgICAgIGRmIDwtIGRmW29yZGVyKGRmWywgMl0sIGRmWywgMV0pLCBdICU+JQ0KICAgICAgICBjYmluZChyYW5rcykgI2FkZCBjb2x1bW4gdG8gZGF0YWZyYW1lIGRmDQogICAgICANCiAgICAgIGRmW3JhbmssIF0kaG9zcGl0YWwgI2dldCBuYW1lIG9mIGhvc3BpdGFsDQogIA0KfQ0KDQpgYGANCg0KDQoNCmBgYHtyfQ0KcmFua0hvc3BpdGFsKCcgdHgnLCAnaGVhcnQgZmFpbHVyZScsIDQpDQpgYGANCg0KYGBge3J9DQpyYW5rSG9zcGl0YWwoJ21kJywgJ2hlYXJ0IGF0dGFjaycsICd3b3JzdCcpDQpgYGANCg0KDQpgYGB7cn0NCnJhbmtIb3NwaXRhbCgnbW4gJywgJ2hlYXJ0IGF0dGFjaycsIDUwMDApDQpgYGANCg0KYGBge3J9DQpyYW5rSG9zcGl0YWwoJ20gbiAnLCAnaGVhcnQgYXR0YWNrJywgMTApDQpgYGANCg0KYGBge3J9DQpyYW5rSG9zcGl0YWwoJ21uICcsICdoZWFydCBhdHRhY2snLCAxMCkNCmBgYA0KDQoNCmBgYHtyIHF1ZXM0LCBlY2hvPUZBTFNFfQ0KDQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygncXVlczQuanBnJykNCg0KYGBgDQoNCg0KYGBge3J9DQpyYW5rYWxsIDwtIGZ1bmN0aW9uKG91dGNvbWUgPSAiaGVhcnQgYXR0YWNrIiwgcmFuayA9ICdiZXN0Jyl7DQogIA0KICAjIyBSZWFkIGRhdGENCiAgYmVzdE9iaiA8LSBiZXN0RngoKQ0KICBkZiA8LSBiZXN0T2JqJGdldERhdGEoKQ0KICANCiAgIyNDaGVjayB0aGF0IG91dGNvbWUgaXMgdmFsaWQNCiAgb3V0Y29tZSA8LSB0cmltd3ModG9sb3dlcihvdXRjb21lKSkNCiAgb3V0Y29tZXMgPC0gYmVzdE9iaiRvdXRjb21lKCkgICNHZXQgbGlzdCBvZiBvdXRjb21lcw0KICBpZighb3V0Y29tZSAlaW4lIG91dGNvbWVzKXsNCiAgICBzdG9wKCJJbnZhbGlkIGlucHV0ISIpDQogIH0NCiAgDQogICMjRm9yIGVhY2ggc3RhdGUsIGZpbmQgdGhlIGhvc3BpdGFsIG9mIHRoZSBnaXZlbiByYW5rDQogIHN0YXRlcyA8LSBzb3J0KGJlc3RPYmokc3RhdGVzKCkpDQogIA0KICAjQ3JlYXRlIGVtcHR5IGRhdGFmcmFtZQ0KICBkX2YgPC0gZGF0YS5mcmFtZShob3NwaXRhbCA9IGNoYXJhY3RlcigpLA0KICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IGNoYXJhY3RlcigpLA0KICAgICAgICAgICAgICAgICAgICBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpDQogIA0KICBmb3IgKHN0YXRlIGluIHN0YXRlcyl7DQogICAgDQogICAgI2dldEhvc3AoKTogcmV0dXJucyBkYXRhIGZyYW1lIHdpdGggaG9zcGl0YWwgYW5kIHN0YXRlIGFzIGNvbHVtbnMNCiAgICB0ZW1wIDwtIGJlc3RPYmokZ2V0SG9zcChkZiwgc3RhdGUsIG91dGNvbWUsIHJhbmspDQoNCiAgICBkX2YgPC0gcmJpbmQoZF9mLCB0ZW1wKQ0KICB9DQoNCiAgZF9mDQogIA0KfQ0KDQpgYGANCg0KDQpgYGB7cn0NCnJhbmthbGwoJ2hlYXJ0IGF0dGFjaycsIDIwKQ0KYGBgDQoNCg0KYGBge3J9DQp0YWlsKHJhbmthbGwoJ3BuZXVtb25pYScgLCd3b3JzdCcpLCAzKQ0KYGBgDQoNCg0KYGBge3J9DQp0YWlsKHJhbmthbGwoJ2hlYXJ0IGZhaWx1cmUnICksIDEwKQ0KYGBgDQoNCg==