2013-05-01 107 views
2

一个矢量I有两个向量分配等级基于多个条件

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

回答

3

也许更像是这样的......?

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

边注:as.vector是没有必要的。

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

你得到了错误的简短说明:

这与其说是mapply被转换什么,但是你问了一个不存在的x的元素。对于xy中的每一个,mapply仅向函数fGrades发送单个值。所以,当那个函数里面你问x[2],R返回NA,因为在这种情况下x有一个只有1

+0

谢谢joran和@DWin。 – earthlink 2013-05-01 23:40:24

+0

我想给我支票,然后切换到乔兰是_just_权。显示你得到了两个消息,但与更好的一个。 – 2013-05-02 04:36:46

1

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

尽管我认为@ joran的findInterval编码更好,但也有帮助您了解功能的行为和正确应用程序的任务。你并不是真的想要与vThresholds配对的vCandidates,这是mapply提供的。此sapply调用使用vThresholds作为固定的x=参数,因此在计算过程中它可用于运行:fGrades