[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:计算综合得分

各科成绩的分值不同,所以评定标准也有差异,在组合之前要先让它们变得可以比较。一种方法就是对变量进行标准化,这样各科成绩都是用单位标准差显示,于是便可以在同一尺度下进行比较:

  1. 标准化
z<-scale(roser[,24])

scale(x,center=TRUE,scale=TRUE)对数据对象x按列进行中心化或标准化。

  1. 计算综合得分
score<-apply(z,1,mean) #对各行计算均值
roster<-cbind(roster,score) #利用cbind()将score添加到数据框中

apply(x,MARGIN,FUN,options) 可以把函数应用到数组某个维度上,margin=1应用到行。

Step3:对学生进行评分

  1. 利用quantile()函数给出学生综合得分的分位数,并以此为分界点进行等级划分。
y<-quantile(roster$score,c(.8,.6,.4,.2))
  1. 对学生成绩重编码为一个类别型变量
#方法一
'''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:根据姓氏和名字排序

  1. 利用函数 strsplit() 拆分姓氏和名字
name<-strsplit((roster$student)," ")
name
  1. 抽取姓氏和名字,并根据姓氏和名字排序
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),]
  • 6
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值