2015-08-14 62 views
-4

這是Coursera提供的R編程課程的一部分任務。我們正在編寫一個函數,使得某一特定狀態下的醫院返回給定結果(心臟病發作,心臟衰竭和肺炎)的30天死亡率最低。這些信息以csv文件形式給出,其中包括link,由另一名學生提供,此作業存在問題。輸入:國家名稱(例如「TX」,「LA」)和結果(「心臟病發作」,「心力衰竭」和「肺炎」)。 輸出:給定狀態下給定結果的最低30天死亡率醫院的名稱。使用R中的order()函數輸出的不一致性(3.2.1)

此外,如果狀態或結果無效,我已成功完成該計劃,並且必須按字母順序排列等價醫院來打破關係。

這是我的代碼。

best<-function(state,outcome){ 
    data<-read.csv("outcome-of-care-measures.csv",colClasses="character") 
    outcomes_valid<-c("heart attack","heart failure","pneumonia") 
    if(!outcome %in% outcomes_valid){stop("invalid outcome")} 
    else if(!state %in% data$State){stop("invalid state")} 
    else{ 
     if(outcome == "heart attack"){ 
      ha<-data[data$State==state,c(2,11)] 
      ha<-ha[order(ha[,2],ha[,1]),] 
      return(as.character(ha[1,1])) 
     } 
     else if(outcome=="heart failure"){ 
      hf<-data[data$State==state,c(2,17)] 
      hf<-hf[order(hf[,2],hf[,1]),] 
      return(as.character(hf[1,1])) 
     } 
     else if(outcome=="pneumonia"){ 
      pn<-data[data$State==state,c(2,23)] 
      pn<-pn[order(pn[,2],pn[,1]),] 
      return(as.character(pn[1,1])) 
     } 
    } 
} 

所以,這是發生了什麼事。我的一些代碼似乎工作正常,因爲當我使用最好的(「TX」,「心臟病發作」)時,我得到了正確的醫院(賽普拉斯費爾班克斯...)。然而,最好的(「TX」,「心力衰竭」)並沒有歸還正確的醫院,而是(哈里斯郡醫院區而不是鄧肯堡)。最好的(「MD」,「心臟病發作」)似乎也起作用,但我的代碼除了列號之外,對於心力衰竭和心臟病發作(以及肺炎)是一樣的。

我嘗試過的不同的事情:改變第二數據集爲ha2,hf2等,將「return(as.character ...)」改爲「head(hf)」以試圖查看正在發生的事情,只是似乎沒有按照字母順序或死亡率順序排列。更改字符名稱(hf $ Hospital.Name)而不是列。

讓我知道是否有任何信息未提供。任何幫助深表感謝!

+1

你的數據被讀取爲因素而不是數字。試試'data $ state <-as.character(data $ State)'和'data [,c(11,17,23)] - as.numeric(as.character(data [,c(11,17,23 )]))' – jeremycg

+0

您也可以使用'read.csv(「result-of-care-measures.csv」,na.strings =「Not Available」)來消除自動強制因子 –

+0

您是否知道當你將它傳遞給多列時的順序行爲? – Vlo

回答

1

也沒有必要把它寫了三次:

best<-function(state,outcome){ 
    data<-read.csv("outcome-of-care-measures.csv",na.strings="Not Available") 
    outcomes_valid<-c("heart attack"=11,"heart failure"=17,"pneumonia"=23) 
    choice <- outcomes_valid[outcome] 
    if(!outcome %in% names(outcomes_valid)) stop("invalid outcome") 
    if(!state %in% data$State) stop("invalid state") 
    df <- data[data$State==state,] 
    as.character(df$Hospital.Name[order(df[,choice], df$Hospital.Name)][1])} 

可以使用指定的載體,尋找的結果和列數的方式。看看我如何編輯outcomes_valid。另一個重要部分是設置參數na.strings="Not Available"。默認情況下,此數據集使用「不可用」作爲缺失值。

測試

best("TX", "heart attack") 
[1] "CYPRESS FAIRBANKS MEDICAL CENTER" 

best("TX", "heart failure") 
[1] "FORT DUNCAN MEDICAL CENTER" 

best("MD", "pneumonia") 
[1] "GREATER BALTIMORE MEDICAL CENTER" 
+0

謝謝!我唯一的問題是爲什麼需要「選擇」變量?爲什麼不能僅僅[,結果]就夠了? – mentorship

+0

因爲「結果」沒有附加到任何列,它只是名稱。 「選擇」具有稍後使用的列號。 –

相關問題