首页 > 解决方案 > 将标记转换为等级到 R

问题描述

我有一个非常简单的问题。假设,我给 100 个学生打了这样的分数:

set.seed(1234)
Marks <- rnorm(100, 55, 10)

z <- runif(100)
Gender <- ifelse(z < 0.5, "M", "F")

#Creating Data frame
Df <- data.frame(SNo = 1:100, Marks, Gender)
head(Df)

现在,我需要为学生提供评分,但评分标准对男性和女性是不同的。评分标准是:

等级标准

我设法解决了这个问题,但我没有发现我的方法很吸引人。我试过这样:

#1 Method
Grade = ifelse(Df$Gender == "M", cut(Df$Marks, breaks = c(0, 35, 45, 55, 101), labels = FALSE), 
                        cut(Df$Marks, breaks = c(0, 40, 50, 60, 101), labels = FALSE)) 
Grade <- as.character(factor(Grade, labels = LETTERS[4:1]))

#2. Method
Gradef <- function(x, cp = c(35, 45, 55)) {
  ifelse(x < cp[1], "D", ifelse(x < cp[2], "C", ifelse(x < cp[3], "B", "A")))
}

Grade2 <- ifelse(Df$Gender == "M", Gradef(Df$Marks), Gradef(Df$Marks, c(40, 50, 60)))
sum(Grade == Grade2)  #both method give same grade

Df$Grade <- Grade

有人可以建议我更好的方法来解决同样的问题吗?我不想在 R 中使用任何外部包。

谢谢

标签: rdataframe

解决方案


mylist = list(F = c(35, 45, 55), M = c(40, 50, 60))
grades = c("D", "C", "B", "A")
Df$Grade = grades[1 + sapply(1:NROW(Df), function(i)
    findInterval(Df$Marks[i], mylist[[Df$Gender[i]]]))]
head(Df, 10)
#   SNo    Marks Gender Grade
#1    1 42.92934      F     C
#2    2 57.77429      F     A
#3    3 65.84441      M     A
#4    4 31.54302      F     D
#5    5 59.29125      F     A
#6    6 60.06056      F     A
#7    7 49.25260      M     C
#8    8 49.53368      M     C
#9    9 49.35548      M     C
#10  10 46.09962      F     B

推荐阅读