2

我有两个向量

vThresholds = as.vector(c(0.12, 0.34, 0.56, 0.85)) 
vCandidates = as.vector(rnorm(100))

我想根据候选人在 vThresholds 中的位置为他们分配成绩。我写了一个函数如下

fGrades = function (x, y) {
  if(y <= x[1]){
    grade = "A"
  } else if(y > x[1] & y <= x[2]){
    grade = "B"
  } else if(y > x[2] & y <= x[3]){
    grade = "C"
  } else if(y > x[3] & y <= x[4]){
    grade = "D"
  }else {grade = "E"}
  grade
}

但是,当我使用

mapply(fGrades, vThresholds, vCandidates)

我收到一个错误

Error in if (y <= x[1]) { : missing value where TRUE/FALSE needed

在跟踪此错误时,我发现 mapply 将 x 转换为 NA。

我可以通过遍历 vCandidates 来解决这个问题。但是,我正在寻找此解决方案的矢量化版本。有没有更简单的方法来做到这一点?

4

2 回答 2

3

也许更像这样……?

 LETTERS[1:5][findInterval(vCandidates,vThresholds)+1]

旁注:as.vector没有必要。

请务必?findInterval仔细阅读以确保您在间隔的边界上获得了您想要的行为。

您收到的错误的简短说明:

与其说mapply是转换任何东西,不如说是您要求的元素x不存在。对于和中的每一个,mapply只向函数发送一个值。因此,当您在该函数中请求 时,R 返回,因为在该上下文中,长度仅为 1。fGradesxyx[2]NAx

于 2013-05-01T20:27:39.540 回答
1

应该使用:sapply( vCandidates, fGrades, x=vThresholds).

虽然我认为@joran 的findInterval编码更好,但还有一个任务是帮助您了解 R*apply函数的行为和正确的应用程序。您并不真正想要 vCandidates 与 vThresholds 的 1-1 配对,这是mapply提供的。此sapply调用使用 vThresholds 作为固定x=参数,因此它可用于:fGrades在计算期间。

于 2013-05-01T22:26:55.907 回答