vlambda博客
学习文章列表

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

    观察此数据集,马上可以发现一些明显的挑战:

R语言数据处理分析实例

    首先,三科考试成绩是无法比较的。由于它们的均值和标准差相差很大,对它们求三科的平均成绩是没有意义的。因此,在组合这些考试成绩之前,必须将其转换为可比较的成绩。因而,我们做如下处理,将三科成绩进行标准化,这样每科考试成绩都是用单位标准差来表示,而非原始的分值尺度表示:

z= scale(scoredata[2:4])z

R语言数据处理分析实例

    scale函数为数据对象按列进行中心化(center=TRUE)或标准化(center=TRUE, scale=TRUE),默认情况下,函数scale对矩阵或数据框的指定列进行均值为0、标准差为1的标准化,给出各科成绩标准化后的结果以及各科成绩的均值和标准差。

    然后,我们通过mean函数来计算各行的均值以获得三科成绩的综合评价得分,并使用cbind函数将其添加到学生成绩的原始数据框中:

Score= apply(z, 1, mean)Scorescoredata2= cbind(scoredata, Score)scoredata2

R语言数据处理分析实例

    apply函数可将一个任意函数应用到矩阵、数组、数据框的任何维度上,在矩阵或数据框中,1表示行,2表示列。cbind函数进行列合并,增加列。

    接下来,我们通过函数quantile给出三科成绩综合评价得分的百分位数,将学生的百分位数排名重编码为一个新的类别型成绩变量grade,如下:

y= quantile(Score, c(0.8,0.6,0.4,0.2))yscoredata2$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

R语言数据处理分析实例

R语言数据处理分析实例

    quantile函数求分位数,这里求Score数值型向量的20%、40%、60%和80%分位点。

    接下来,我们使用strsplit函数以空格把学生姓名拆分为姓氏和名字:

name= strsplit(scoredata2$studentname, " ")namelastname= sapply(name, "[", 2)firstname= sapply(name, "[", 1)scoredata3= cbind(firstname, lastname, scoredata2[-1])scoredata3

R语言数据处理分析实例

    strsplit函数应用到一个字符串向量上会返回一个列表,使用sapply函数分别提取列表中每个成分的第一个元素和第二个元素,"["一个可以提取某个对象的一部分的函数,再使用cbind函数将它们添加到学生成绩的原始数据中。

    最后,我们使用order函数依姓氏和名字对数据集进行排序,完成这个数据任务。

scoredata4= scoredata3[order(lastname, firstname),]scoredata4

    

往期文章: