使用 sort() 和 cut() 将数字向量分割成组



这是我试图解决的问题:

创建一个函数,该函数输入数字等级向量(从 0 到 100)并输出字母等级向量。A-D的分组评分不是通过固定的临界值(例如A =得分90到100),而是通过使用一条曲线,其中40%获得A,30%获得B,20%获得C,10%

获得D。

这是我到目前为止写的。它返回一个错误(见底部)。我解决这个问题的方式有什么问题?

  letter.grade <- function(grades){
  num.a <- .4*length(grades)
  num.b <- .3*length(grades)
  num.c <- .2*length(grades)
  num.d <- .1*length(grades)
  sort.grades <- sort(grades, decreasing = TRUE)
  cut(grades,
    breaks = c(sort.grades[0:num.a],sort.grades[num.a+1:num.b],
              sort.grades[num.b+1:num.c],
              sort.grades[num.c+1:num.d]),
    labels = c("A", "B", "C", "D")
  )
}
letter.grade(c(60, 39, 58, 36, 41, 44, 89, 17, 47, 63))

错误信息:

Error in cut.default(grades, breaks = c(sort.grades[0:num.a], 
sort.grades[num.a +  : 'breaks' are not unique 

谢谢!

试试这个:

letter.grade(c(60, 39, 58, 36, 41, 44, 89, 17, 47, 63))
letter.grade <- function(grades){
  num.a <- .6*length(grades)
  num.b <- .3*length(grades)
  num.c <- .1*length(grades)
  sort.grades <- sort(grades, decreasing = FALSE)
  cut(grades,
    breaks = c(0,sort.grades[num.a],sort.grades[num.b],
              sort.grades[num.c],100),
    labels = c("D", "C", "B", "A")
  )
}
letter.grade(c(60, 39, 58, 36, 41, 44, 89, 17, 47, 63))

特别要注意的是,因为你想要四个类别,所以你必须指定五个(而不是四个)休息(包括下限和上限),就像如果你想用每米一根柱子铺设 100 米的围栏一样,你需要 101 个栅栏柱。

使用 quantile()cut()

letter.grade<-function(samp){
  q<-quantile(samp,c(1,0.6,0.3,0.1,0))
  res<-cut(samp,q,include.lowest=TRUE)
  levels(res)<-c("D","C","B","A")
  return(res)
}
letter.grade(c(60, 39, 58, 36, 41, 44, 89, 17, 47, 63))
[1] A C A C B B A D B A
Levels: D C B A

如果您不喜欢关卡,请使用as.numeric()

最新更新