[R语言基础]——数据处理实例
前言
之前我们已经学习了R对数据预处理的一些方法,接下来将结合函数利用R对一个实际案例进行简单的数据处理。
问题
有一组学生各科成绩数据,为了给所有学生建立一个单一的成绩衡量指标,需要将这些各科成绩组合起来,并以此根据判定成绩等级,最后按字母顺序对学生排序。
Step1:建立数据框
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)
建立了一个原始表格的数据框,以便后续利用R函数进行分析。
Step2:计算综合得分
各科成绩的分值不同,所以评定标准也有差异,在组合之前要先让它们变得可以比较。一种方法就是对变量进行标准化,这样各科成绩都是用单位标准差显示,于是便可以在同一尺度下进行比较:
- 标准化
z<-scale(roser[,2:4])
scale(x,center=TRUE,scale=TRUE)对数据对象x按列进行中心化或标准化。
- 计算综合得分
score<-apply(z,1,mean) #对各行计算均值
roster<-cbind(roster,score) #利用cbind()将score添加到数据框中
apply(x,MARGIN,FUN,options) 可以把函数应用到数组某个维度上,margin=1应用到行。
Step3:对学生进行评分
- 利用quantile()函数给出学生综合得分的分位数,并以此为分界点进行等级划分。
y<-quantile(roster$score,c(.8,.6,.4,.2))
- 对学生成绩重编码为一个类别型变量
#方法一
'''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]]<-"E"
'''
#方法二
roster<-within(roster,{
grade[score>=y[1]]<-"A"
grade[score<y[1] & score>=y[2]]<-"B"
grade[score<y[2] & score>=y[3]]<-"C"
grade[score<y[3] & score>=y[4]]<-"D"
grade[score<y[4]]<-"E"
})
roster
Step4:根据姓氏和名字排序
- 利用函数 strsplit() 拆分姓氏和名字
name<-strsplit((roster$student)," ")
name
- 抽取姓氏和名字,并根据姓氏和名字排序
Firstname<-sapply(name,"[",1)
Lastname<-sapply(name,'[',2)
roster<-cbind(Firstname,Lastname,roster[,-1])
roster
roster[order(Lastname,Firstname),]
" [ "是一个可以提取某个对象的一部分的函数——在这里用来提取列表name各个成分的第一个或第二个元素
完整代码
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)
z<-scale(roster[,2:4])
score<-apply(z,1,mean) #对各行计算均值
roster<-cbind(roster,score) #利用cbind()将score添加到数据框中
y<-quantile(roster$score,c(.8,.6,.4,.2))
y
##变量重编码
#方法一
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]]<-"E"
#方法二
roster<-within(roster,{
grade[score>=y[1]]<-"A"
grade[score<y[1] & score>=y[2]]<-"B"
grade[score<y[2] & score>=y[3]]<-"C"
grade[score<y[3] & score>=y[4]]<-"D"
grade[score<y[4]]<-"E"
})
roster
name<-strsplit((roster$student)," ")
name
Firstname<-sapply(name,"[",1)
Lastname<-sapply(name,'[',2)
roster<-cbind(Firstname,Lastname,roster[,-1])
roster
roster[order(Lastname,Firstname),]