这是我试图解决的问题:
创建一个函数,该函数输入数字等级向量(从 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()