r - 将标记转换为等级到 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 中使用任何外部包。
谢谢
解决方案
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
推荐阅读
- vue.js - 如何根据环境 if 子句更改 vueJs 路由中的组件源?
- javascript - 为什么在 useEffect 钩子中的 forEach 循环之后,推送到数组的数据会消失?
- docker - 定义一组使用 docker compose 运行的服务
- web - 在地图上显示少数车辆的实时位置
- javascript - adminbro 更改密码和登录
- r - R缩放功能不适用于csv文件导入
- angular - 我们如何在按钮中显示日期
- python - 为什么我在 ReadTheDocs 上的某些页面没有显示?
- visual-studio - 是否可以限制 Intellisense CPU 的使用?
- python - while 循环中的 print() 和 return 语句