查找向量中的最大数字,该数字小于特定值

时间:2017-10-18 08:41:29

标签: r

我想为R中的学生找到失败科目的最高等级。我已经写了这个功能,但它看起来更像是java代码而不是R,因为它使用循环遍历向量而不是使用特殊函数在R.的目的,请你建议一个替代解决方案

grades <- c(62, 100, 45, 40, 46, 55, 56, 70)

largestFail <- function(grades){
  location <- -1
  faildFound <- FALSE

  for(i in 1:length(grades)){
    if(grades[i] < 50){
      if(!faildFound) location <- i
      if(grades[i] > grades[location]) location <- i
      faildFound <- TRUE
    }
  }
  return (location)
}
print (grades) # 5

2 个答案:

答案 0 :(得分:4)

这很好用:

max(grades[grades < 50])

您将grades向量子集化为50以下的值,然后提取其最大值。

如果您需要详细了解,可以单独评估这些部件:

  • grades < 50会为50
  • 以下的所有值返回TRUE的逻辑向量
  • grades[grades < 50]然后是50以下所有值的向量
  • 最后,围绕此向量包裹max()以找到最高失败等级

如果你想在没有学生失败的情况下返回-1,那么这样的事情应该可以胜任:

grades <- c(60, 70, 80)

if(any(grades < 50)){
  return(max(grades[grades < 50])
)
} else {
  return(-1)
}

一个较短但不太清晰的解决方案,就是在你的等级向量上加上-1:

grades <- c(60, 70, 80)
grades <- c(grades, -1)
max(grades[grades < 50])

答案 1 :(得分:3)

另一种方法,使用which.max,但在通话前将NA之前的值替换为阈值:

which.max(replace(grades, grades>=50, NA))
#[1] 5