R语言数据处理分析实例
【前言】
R是一种块状结构程序语言,“块”由大括号划分,当“块”只包含一条语句时大括号可以省略。程序语句由换行符或分号分隔。和许多脚本语言一样,R语言不需要“声明”变量。
接下来我们一起来处理分析一个简单的数据任务。
一组学生参加了数学、科学和英语三科考试。为了给所有学生确定一个综合的成绩衡量指标,需要将这些科目的成绩组合起来,将排名在前20%的学生评定为A,接下来20%的学生评定为B,依此类推,最后,按字母顺序对学生进行排序。请试处理分析。
如下,我们首先创建原始数据框:
studentname= 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)
scoredata= data.frame(studentname, math, science, English, stringsAsFactors=FALSE)
scoredata
观察此数据集,马上可以发现一些明显的挑战:
首先,三科考试成绩是无法比较的。由于它们的均值和标准差相差很大,对它们求三科的平均成绩是没有意义的。因此,在组合这些考试成绩之前,必须将其转换为可比较的成绩。因而,我们做如下处理,将三科成绩进行标准化,这样每科考试成绩都是用单位标准差来表示,而非原始的分值尺度表示:
z= scale(scoredata[2:4])
z
scale函数为数据对象按列进行中心化(center=TRUE)或标准化(center=TRUE, scale=TRUE),默认情况下,函数scale对矩阵或数据框的指定列进行均值为0、标准差为1的标准化,给出各科成绩标准化后的结果以及各科成绩的均值和标准差。
然后,我们通过mean函数来计算各行的均值以获得三科成绩的综合评价得分,并使用cbind函数将其添加到学生成绩的原始数据框中:
Score= apply(z, 1, mean)
Score
scoredata2= cbind(scoredata, Score)
scoredata2
apply函数可将一个任意函数应用到矩阵、数组、数据框的任何维度上,在矩阵或数据框中,1表示行,2表示列。cbind函数进行列合并,增加列。
接下来,我们通过函数quantile给出三科成绩综合评价得分的百分位数,将学生的百分位数排名重编码为一个新的类别型成绩变量grade,如下:
y= quantile(Score, c(0.8,0.6,0.4,0.2))
y
scoredata2$grade[Score >=y[1]]= "A"
scoredata2$grade[Score < y[1] & Score >=y[2]]= "B"
scoredata2$grade[Score < y[2] & Score >=y[3]]= "C"
scoredata2$grade[Score < y[3] & Score >=y[4]]= "D"
scoredata2$grade[Score < y[4]]= "E"
scoredata2
quantile函数求分位数,这里求Score数值型向量的20%、40%、60%和80%分位点。
接下来,我们使用strsplit函数以空格把学生姓名拆分为姓氏和名字:
name= strsplit(scoredata2$studentname, " ")
name
lastname= sapply(name, "[", 2)
firstname= sapply(name, "[", 1)
scoredata3= cbind(firstname, lastname, scoredata2[-1])
scoredata3
strsplit函数应用到一个字符串向量上会返回一个列表,使用sapply函数分别提取列表中每个成分的第一个元素和第二个元素,"["是一个可以提取某个对象的一部分的函数,再使用cbind函数将它们添加到学生成绩的原始数据中。
最后,我们使用order函数依姓氏和名字对数据集进行排序,完成这个数据任务。
scoredata4= scoredata3[order(lastname, firstname),]
scoredata4
往期文章: