使用R中的order()函数输出的不一致性(3.2.1)

问题描述:

这是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 jeremycg

+0

您也可以使用'read.csv(“result-of-care-measures.csv”,na.strings =“Not Available”)来消除自动强制因子 –

+0

您是否知道当你将它传递给多列时的顺序行为? – Vlo

也没有必要把它写了三次:

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

因为“结果”没有附加到任何列,它只是名称。 “选择”具有稍后使用的列号。 –