2

私は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 に答える