INTRODUCTION

LOAD HELPER FUNCTIONS

source('helper_functions.R')

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==