【问题标题】:IF statement causing wrong results in functionIF 语句导致函数中的错误结果
【发布时间】:2020-06-20 19:45:32
【问题描述】:

我正在尝试在 R 中完成 coursera 作业。我的代码在作业 1 中正常工作,我在 R 中编写了一个函数来对医院进行排名;在作业 2 中,我必须在已经编写的函数中添加一些 IF 或 IF ELSE IF 语句。

函数给出最终的数据帧。

  1. 如果输入参数num==best,函数返回最终数据帧的第一行
  2. 如果输入参数num==worst,函数返回最终数据帧的最后一行
  3. 如果最终数据帧的输入参数num > max row count,函数返回NA
  4. 如果输入参数num< max row count,函数从数据框中返回该行

现在,if 语句仅适用于场景 3 和 4。对于场景 1 和 2,它返回 NA-,即场景 3 的返回值。

我编写 IF 语句的方式有问题(可以是序列或条件或其他内容),因此我得到了场景 1,2 的 NA 返回值

代码如下,TIA

outcomeDF<-outcome[,c(2,7,n)]
names(outcomeDF)<-c("Hospital","State","Outcomess")
finalDF<-filter(outcomeDF,outcomeDF$State==sta)
     
DFSlist<-arrange(finalDF,finalDF$State,finalDF$Outcomess,finalDF$Hospital)

if (num > nrow(DFSlist)) print ("NA")
  else if (num < nrow(DFSlist)) c<-(DFSlist[num,])
  else if (num =="best")c<-(DFSlist[1,])
  else (num =="worst")c<-(DFSlist[(nrow(DFSlist)),])
return(c)

【问题讨论】:

  • else (num =="worst") 将不起作用,因为 else 没有条件。在这里你又需要一个if-statement。
  • 谢谢。将在Else旁边取出条件

标签: r if-statement


【解决方案1】:

约翰霍普金斯大学 Coursera R 编程 课程作业 3 的第二部分是一个名为 rankhospital() 的函数。

原帖中的代码失败的原因之一是它直接比较了numnrow(DFSlist)。当num == "best"num == "worst"时,OP中的第一个条件返回TRUE,并返回NA而不是DFSlist数据框中的第一行。

rankhospital() 函数包含两个位置参数stateoutcome 和一个命名参数num

该函数的数据来自美国卫生与公众服务部提供的医院比较数据库中的 2012 年护理测量结果。

所需函数的存根如下所示。

rankhospital <- function(state, outcome, num="best") {
   # answer goes here
}

函数需要做三件事,包括:

  1. 读取医院结果数据
  2. 验证输入参数(例如检查无效状态等)
  3. 处理数据并返回state 参数中指定的州中排名第 n 的医院,以获得三种结果之一(心脏病发作、心力衰竭或肺炎)

OP 中的问题询问如何使用函数中的第三个参数 num 来返回最佳、最差或数字排名。

一旦数据被子集到正确的状态,并按照指令排序,处理num 参数的一种方法如下。

# sort & subset here
 sortedSubset <- # code goes here, includes hospital, state, other variables
                 # sorted in required order (outcome then hospital name)

 # return hospital name, given num argument 
 if (num == "best") {
      return( sortedSubset[1,1]) 
 } else if (num == "worst") {
      return(sortedSubset[nrow(sortedSubset),1])
 } else if (as.numeric(num) > nrow(sortedSubset)) {
      return("NA")
 } else return (sortedSubset[as.numeric(num),1])

如果工作正常,该函数会为随分配说明提供的测试用例生成以下答案。

> source("./rprogramming/rankhospital.R")
> 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"

注意:在 JHU 数据科学专业中发布编程作业的完整解决方案违反了 Coursera 荣誉准则。因此,我在没有发布 rankhospital() 函数的完整解决方案的情况下解释了 OP 代码被破坏的地方。

【讨论】:

  • 值得一提的是,对于非数字 numnum &gt; nrow(DFSlist) 的计算结果为 TRUE,即 num == "best。您的条件顺序巧妙地避免了这个问题。
  • @MartinGal - 是的,OP 中的代码失败的原因之一是第一个if()numnrow() 的结果进行比较,因此会产生错误的答案当num 是“最佳”或“最差”时。
  • Martin Gal:请多解释一下你在这里提到的内容。左侧 (LHS) 上的 num 是否采用右侧 (RHS) 上的 nrow(DFSlist) 类?它是字符与数字的比较吗?例如 11
  • @nancysng00 - 回答您向 Martin Gal 提出的问题,当 R 使用 relational operator 比较不同类型的对象时,它使用两种类型中最低级别的优先级。将字符值与整数进行比较时,R 将整数转换为字符并进行比较。例如,num &lt;- "best"; num &lt; 90000 根据每个字符的 ASCII 值的逐个字符比较返回 FALSE。由于 b 在 ASCII 中是 98,而 9 在 ASCII 中是 57,因此“最佳”>“90000”。
【解决方案2】:

你试过用大括号括起来 if 语句吗?

另外,c() 是我们将事物转化为向量的方式,因此我强烈建议不要将变量命名为 c

  # DF manipulation
  outcomeDF <- outcome[, c(2, 7, n)]
  names(outcomeDF) <-c("Hospital", "State", "Outcomess")
  finalDF <- filter(outcomeDF, outcomeDF$State==sta)
  DFSlist <- arrange(finalDF, finalDF$State, finalDF$Outcomess, finalDF$Hospital)

  # results logic
  if (num > nrow(DFSlist)) {
     print ("NA")
  } else if (num < nrow(DFSlist)) {
     res <-(DFSlist[num,])
  } else if (num =="best") {
     res <-(DFSlist[1,])
  } else {
     # (num =="worst") <- this doesn't seem to do anything
     res <-(DFSlist[(nrow(DFSlist)),])
    }

  return(res)

此外,通过清理您的代码,我发现了一行代码,可能会干扰您的结果。这可能是罪魁祸首。

另外,num 没有为这个 sn-p 代码定义,而且你有一个悬挂的 },你可能也知道。

【讨论】:

  • 同意“c”不应该用于按照命名约定命名变量。
  • 只想发布完整功能的一部分,因此挂了“}”。谢谢提醒。
  • 我仍然得到“最佳”和“西部”场景的“NA”。我猜: num 在第一个条件(num > nrow(DFSlist),它遇到的右手边的参数类。非常新的 R,所以不知道是什么问题。
  • 好吧,再看一遍这表明num 试图成为一个整数,但“最佳”和“最差”是类字符。也许这就是你的问题所在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-14
相关资源
最近更新 更多