实验数据获取后需要对数据进行一系列标准化分析,我们从一个小例子对数据标准化的流程进行讲解。抛砖引玉,激发你的灵感。
语言环境:R version 4.0.3 (2020-10-10)
IDE:RStudio
参考书:R语言实战(第2版) [美] Robert I. Kabacoff 著
数据集
Student Math Science English
1 John Davis 502 95 25
2 Angela Williams 600 99 22
3 Bullwinkle Moose 412 80 18
4 David Jones 358 82 15
5 Janice Markhammer 495 75 20
6 Cheryl Cushing 512 85 28
7 Reuven Ytzrhak 410 80 15
8 Greg Knox 625 95 30
9 Joel England 573 89 27
10 Mary Rayburn 522 86 18
数据集说明:
1、Student列:名称和姓氏用 "空格" 隔开。
2、2-3列:依次为数学、科学及英语得分,但各科总分不同。
需求
1、根据数学、科学及英语得分对学生进行综合分析。
2、基于综合分析结果的相对名次给出A-F评分(以20%的比例间隔划分)。
3、然后根据学生姓名首字母对花名册进行排序。
思考
1、标准化:对所有科目得分进行综合分析。因为各科总分不同,而且数学得分与其他科目差值悬殊,所以需要对三大学科进行标准化处理。
2、评分:获取标准化后成绩数据集,以20%比例间隔划分后的数值来进行A-F评分。
3、排序:切分Student列的姓名,然后根据姓氏进行排序。
代码实现
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 = F)
z <- scale(roster[,2:4]) # 标准化
score <- apply(z, 1, mean) # 对每行取平均值
roster <- cbind(roster,score) # 将score绑定到roster上
y <- quantile(score,c(.8,.6,.4,.2)) # 对数据集按照指定百分数划分比例
# 对学生进行划分, 创建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"
# 拆分姓名
name <- strsplit(roster$Student," ")
Firstname <- sapply(name,"[",1)
Lastname <- sapply(name, "[",2)
roster <- cbind(Firstname,Lastname,roster[-1])
# 排序
roster <- roster[order(Lastname,Firstname),]
结果
函数解释
options(digits = 2) # 设置数据保留两位小数
scale() # 默认情况下, 该函数对数据进行 均值为0 标准差为1 的标准化
quantile(score,c(.8,.6,.4,.2)) # 对数据集按照指定百分数划分比例
strsplit(roster$Student," ") # 对姓名以"空格"切分
文末
天下事有难易乎? 为之,则难者亦易矣;不为,则易者亦难矣。 人之为学有难易乎?学之,则难者亦易矣;不学,则易者亦难矣。—— 彭端淑 《 为学一首示子侄 》