根据多个条件为矢量分配等级

时间:2013-05-01 20:13:22

标签: r

我有两个载体

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来解决这个问题。但是,我正在寻找这个解决方案的矢量化版本。有更简单的方法吗?

2 个答案:

答案 0 :(得分:3)

也许更像这样的东西......?

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

旁注:as.vector不是必需的。

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

您所犯错误的简短说明:

并不是mapply正在转换任何东西,而是你要求x的元素不存在。对于mapplyfGrades中的每一个,x仅向函数y发送一个值。因此,当您在该函数内部询问x[2]时,R返回NA,因为在该上下文中x的长度仅为1。

答案 1 :(得分:1)

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

虽然我认为@joran的findInterval编码更好,但也有帮助您理解R *apply - 函数的行为和正确的应用程序的任务。你真的不希望将vCandidates与vThids配对为1-1,这是mapply提供的。此sapply调用使用vThresholds作为固定x=参数,因此在计算过程中可以使用fGrades