首页 > 生活百科 > firstname(英语学习之数据框)

firstname(英语学习之数据框)

实验数据获取后需要对数据进行一系列标准化分析,我们从一个小例子对数据标准化的流程进行讲解。抛砖引玉,激发你的灵感。

语言环境: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," ") # 对姓名以"空格"切分

文末

天下事有难易乎? 为之,则难者亦易矣;不为,则易者亦难矣。 人之为学有难易乎?学之,则难者亦易矣;不学,则易者亦难矣。—— 彭端淑 为学一首示子侄