我有两个载体
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来解决这个问题。但是,我正在寻找这个解决方案的矢量化版本。有更简单的方法吗?
答案 0 :(得分:3)
也许更像这样的东西......?
LETTERS[1:5][findInterval(vCandidates,vThresholds)+1]
旁注:as.vector
不是必需的。
请务必仔细阅读?findInterval
,以确保您在间隔的边界上获得所需的行为。
您所犯错误的简短说明:
并不是mapply
正在转换任何东西,而是你要求x
的元素不存在。对于mapply
和fGrades
中的每一个,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
。