这是我试图解决的问题:
创建一个函数,输入数字成绩向量(从 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))
特别注意,因为您想要四个类别,所以您必须指定五个(而不是四个)断点(包括下限和上限),就像您想铺设 100m 的栅栏,每米有一个柱子一样,您将需要 101 个栅栏柱。
关于r - 使用 sort() 和 cut() 将数值向量分段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21739049/