step0.问题描述
一组学生参加了数学、科学、英语考试,为了给所有学生确定一个单一的成绩衡量标准,需要将这些科目的成绩组合起来。另外,你想将前20%的学生评定为A,接下来20%的学生评定为B,以此类推。最后,你希望按字母对学生进行排序。数据如下表所示。
step1.输入数据
输入原始数据,使用数据框存储以上数据至变量roster中。
options(digits=2)
Student <- c("John Davis","Angela Williams","Bullwinkle Moose",
"David Jones","Janice Markhammer",
"Cheryl Cushing","Reuven Ytzrhak",
"Greg Knox","Joel England","Mary Rayburn")
math <- c(502, 600, 412, 358, 495, 512, 410, 625, 573, 522)
science <- c(95, 99, 80, 82, 75, 85, 80, 95, 89, 86)
english <- c(25, 22, 18, 15, 20, 28, 15, 30, 27, 18)
roster <- data.frame(Student, math, science, english,
stringsAsFactors=FALSE)
step2.数据标准化
使用scale()函数,对数据进行标准化处理,这样每科的成绩均使用单位标准差来进行表示,而不是以原始尺度来表示了,便于比较以及整合。
z <- scale(roster[,2:4])
step3.计算综合得分
通过mean()函数来计算各行的均值以获得综合得分,并使用cbind()函数将其添加到表中。
score <- apply(z, 1, mean)
roster <- cbind(roster, score)
step4.分位
通过quantile()函数,对学生的综合得分进行分位操作,依次计算出20%,40%...80%的分位点。
y <- quantile(score, c(.8,.6,.4,.2))
step5.换算得分等级
通过逻辑运算符,将百分位数平明重新编码为一个新的类别,并在表中使用变量grade表示。
roster$grade[score >= y[1]] <- "A"
roster$grade[score < y[1] & score >= y[2]] <- "B"
roster$grade[score < y[2] & score >= y[3]] <- "C"
roster$grade[score < y[3] & score >= y[4]] <- "D"
roster$grade[score < y[4]] <- "F"
step6.名称拆分
使用strplit()函数将学生姓名拆分为firstname、lastname,并重新赋值到表中
name <- strsplit((roster$Student), " ")
Lastname <- sapply(name, "[", 2)
Firstname <- sapply(name, "[", 1)
roster <- cbind(Firstname,Lastname, roster[,-1])
step7.排序
使用order()函数依姓氏、名称进行排序。
roster <- roster[order(Lastname,Firstname),]