r - 使用 sort() 和 cut() 将数值向量分段

标签 r

这是我试图解决的问题:

创建一个函数,输入数字成绩向量(从 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/

相关文章:

r - 如何将R中向量中的 "0"转换为 "00"?

r - 是否可以将 Spark 中的 data.table 与 Spark Dataframes 一起使用?

r - R : getting rules with only one item in the left-hand side 中的封装规则

r - 根据条件更改ggplot2中某些轴标签的格式

r - 缩短坐标之间的箭头/线/段

r - R lubridate 中两个日期之间的严格差异

r - 在 shiny 中,如何从包含基于 selectinputs 添加列的 sliderinput 中绘制

r - 从 R 调用 Stata 函数

r - 每季度生成日期序列

r - 增加 ggplot2 中图例演示的中断