问题:

  一组学生参加了数学、科学和英语考试。为了给所有的学生确定一个单一的成绩衡量指标,需要将这些科目的成绩组合起来。另外,还想将前20%的学生评定为A,接下来20%的学生评定为B,以此类推。最后,希望按字母顺序对学生排序。

Excel中的数据表(自己一个个敲的,最讨厌做的事情TT)

  

StuId StuName Math Science English
1 John Davis 502 95 25
2 Angela Williams 465 67 12
3 Bull Jones 621 78 22
4 Cheryl Cushing 575 66 18
5 Reuven Ytzrhak 454 96 15
6 Joel Knox 634 89 30
7 Mary Rayburn 576 78 37
8 Greg England 421 56 12
9 Brad Tmac 599 68 22
10 Tracy Mcgrady 666 100 38

step1:输入数据——R语言导入xlsx

  1. #1数据输入
  2. install.packages("xlsx")
  3. library(xlsx)
  4. workbook<-"D:/R语言/code/R语言实战前五章小试身手/StuScore.xlsx"#也可用‘\\’注意转义字符
  5. StuScore<-read.xlsx(workbook,)#1表示sheet1
  6. StuScore

step2:数据预处理——将变量进行标准化

因为数学,科学和英语考试的分值不同(均值和标准差均有较大差异),在组合之前要让他们变得可以比较

方法:变量标准化,把每科成绩都用单位标准差表示

  tips:

  1. 所谓数据的标准化是指中心化之后的数据在除以数据集的标准差,即数据集中的各项数据减去数据集的均值再除以数据集的标准差。
  2. 例如有数据集1, , , , ,其均值为3,其标准差为1.,那么标准化之后的数据集为(-)/1.87,(-)/1.87,(-)/1.87,(-)/1.87,(-)/1.87,即:-1.069,-0.535,,1.604,
  3.  
  4. 数据中心化和标准化的意义是一样的,为了消除量纲对数据结构的影响。

  这里使用scale()可以直接实现

  1. > #2数据预处理
  2. > options(digits=)#限定为2位小数
  3. > afterscale<-scale(StuScore[,:])
  4. > afterscale
  5. Math Science English
  6. [,] -0.58 1.040 0.20
  7. [,] -1.02 -0.815 -1.17
  8. [,] 0.82 -0.086 -0.12
  9. [,] 0.28 -0.881 -0.54
  10. [,] -1.15 1.106 -0.86
  11. [,] 0.98 0.643 0.73
  12. [,] 0.29 -0.086 1.47
  13. [,] -1.54 -1.544 -1.17
  14. [,] 0.56 -0.749 -0.12
  15. [,] 1.35 1.372 1.57
  16. attr(,"scaled:center")
  17. Math Science English
  18.  
  19. attr(,"scaled:scale")
  20. Math Science English
  21. 84.7 15.1 9.5

  这里,有两个疑问:

  1.说好的输出两位小数呢?Science那一栏输出的都是三位小数,怎么回事?

    

  2.这是什么东东?

    1. attr(,"scaled:center")
    2. Math Science English
    3.  
    4. attr(,"scaled:scale")
    5. Math Science English
    6. 84.7 15.1 9.5

    scale方法中的两个参数center和scale的解释:
          1.center和scale默认为真,即T或者TRUE
          2.center为真表示数据中心化
          3.scale为真表示数据标准化

   也就是说:center表示一列数据的均值,scale则表示标准差(有兴趣的同学,可以用Excel的STDEV函数验证一下)

step3:通过函数mean()来计算各行的均值以及获得综合得分,并使用cbind()将其添加到花名册中

  1. > #3在afterscale中计算标准差均值,并将其添加到StuScore
  2. > score<-apply(afterscale,,mean)#1表示行,mean表示均值函数
  3. > StuScore<-cbind(StuScore,score)
  4. > StuScore
  5. StuId StuName Math Science English score
  6. John Davis 0.22
  7. Angela Williams -1.00
  8. Bull Jones 0.21
  9. Cheryl Cushing -0.38
  10. Reuven Ytzrhak -0.30
  11. Joel Knox 0.78
  12. Mary Rayburn 0.56
  13. Greg England -1.42
  14. Brad Tmac -0.10
  15. Tracy Mcgrady 1.43

Step4:函数quantile()给出学生综合得分的百分位数

  quantile(x,probs):求分位数,其中x为待求分位数的数值型向量,probs为一个由[0,1]之间的概率值组成的数值向量

  1. > afterquantile<-quantile(score,c(.,.,.,.))
  2. > afterquantile
  3. % % % %
  4. 0.60 0.21 -0.18 -0.50

step5:使用逻辑运算符,把score转为等级(离散型)

  1. > #5使用逻辑运算符,把score转为等级(离散型)
  2. > StuScore$grade[score>=afterquantile[]]<-"A"
  3. > StuScore$grade[score<afterquantile[]&&score>=afterquantile[]]<-"B"
  4. > StuScore$grade[score<afterquantile[]&&score>=afterquantile[]]<-"C"
  5. > StuScore$grade[score<afterquantile[]&&score>=afterquantile[]]<-"D"
  6. > StuScore$grade[score<afterquantile[]]<-"E"
  7. > StuScore
  8. StuId StuName Math Science English score grade
  9. John Davis 0.22 B
  10. Angela Williams -1.00 E
  11. Bull Jones 0.21 B
  12. Cheryl Cushing -0.38 E
  13. Reuven Ytzrhak -0.30 E
  14. Joel Knox 0.78 B
  15. Mary Rayburn 0.56 B
  16. Greg England -1.42 E
  17. Brad Tmac -0.10 E
  18. Tracy Mcgrady 1.43 B

Step6:使用strsplit()以空格为界把学生姓名拆分为姓氏和名字

  1. > #Step6:使用strsplit()以空格为界把学生姓名拆分为姓氏和名字
  2. > name<-strsplit((StuScore$StuName)," ")
  3. Error in strsplit((StuScore$StuName), " ") : non-character argument
  4. > name
  5. [] "Jim" "Tony" "Lisa" "Tom"

  这里出错了,原因很明确,没有字符型的参数传入,反应过来,原来是用execl导入的时候,StuName那一列默认的是什么类型的呢?我们来检测一下

  1. > is.numeric(StuScore$StuName)
  2. [] FALSE
  3. > is.logical(StuScore$StuName)
  4. [] FALSE
  5. > is.character(StuScore$StuName)
  6. [] FALSE
  7. > is.complex(StuScore$StuName)
  8. [] FALSE
  9. > help(type)
  10. > typeof(StuScore$StuName)
  11. [] "integer"

  因此,我们把他改为字符型

  1. > #Step6:使用strsplit()以空格为界把学生姓名拆分为姓氏和名字
  2. > StuScore$StuName<-as.character(StuScore$StuName)
  3. > is.character(StuScore$StuName)
  4. [] TRUE
  5. > name<-strsplit(StuScore$StuName," ")
  6. > name
  7. [[]]
  8. [] "John" "Davis"
  9.  
  10. [[]]
  11. [] "Angela" "Williams"
  12.  
  13. [[]]
  14. [] "Bull" "Jones"
  15.  
  16. [[]]
  17. [] "Cheryl" "Cushing"
  18.  
  19. [[]]
  20. [] "Reuven" "Ytzrhak"
  21.  
  22. [[]]
  23. [] "Joel" "Knox"
  24.  
  25. [[]]
  26. [] "Mary" "Rayburn"
  27.  
  28. [[]]
  29. [] "Greg" "England"
  30.  
  31. [[]]
  32. [] "Brad" "Tmac"
  33.  
  34. [[]]
  35. [] "Tracy" "Mcgrady"

Step7:把name分成Firstname和LastName,加入到StuScore中

  1. > #7把name分成Firstname和LastName,加入到StuScore中
  2. > FirstName<-sapply(name,"[",)
  3. > LastName<-sapply(name,"[",)
  4. > StuScore<-cbind(FirstName,LastName,StuScore[,-])
  5. > StuScore
  6. FirstName LastName LastName StuName Math Science English score grade
  7. John Davis Davis John Davis 0.22 B
  8. Angela Williams Williams Angela Williams -1.00 E
  9. Bull Jones Jones Bull Jones 0.21 B
  10. Cheryl Cushing Cushing Cheryl Cushing -0.38 E
  11. Reuven Ytzrhak Ytzrhak Reuven Ytzrhak -0.30 E
  12. Joel Knox Knox Joel Knox 0.78 B
  13. Mary Rayburn Rayburn Mary Rayburn 0.56 B
  14. Greg England England Greg England -1.42 E
  15. Brad Tmac Tmac Brad Tmac -0.10 E
  16. Tracy Mcgrady Mcgrady Tracy Mcgrady 1.43 B
  17. >

Step8:order排序

  1. > #8order()排序
  2. > StuScore[order(LastName,FirstName),]
  3. FirstName LastName LastName StuName Math Science English score grade
  4. Cheryl Cushing Cushing Cheryl Cushing -0.38 E
  5. John Davis Davis John Davis 0.22 B
  6. Greg England England Greg England -1.42 E
  7. Bull Jones Jones Bull Jones 0.21 B
  8. Joel Knox Knox Joel Knox 0.78 B
  9. Tracy Mcgrady Mcgrady Tracy Mcgrady 1.43 B
  10. Mary Rayburn Rayburn Mary Rayburn 0.56 B
  11. Brad Tmac Tmac Brad Tmac -0.10 E
  12. Angela Williams Williams Angela Williams -1.00 E
  13. Reuven Ytzrhak Ytzrhak Reuven Ytzrhak -0.30 E
  14. >

  虽然是照着书本上做的,但是,代码必须要自己敲一遍,过程中遇到的一些小问题也解决了,就算菜鸟简单入门。这样样例还可以继续拓展,把R语言实战前5章的内容尽可能用一边,可以绘制一些图,等等,本文还会继续更新。

为ScienceScore绘制条形图

  根据不同的分数等级,显示不同的颜色。

  1. #为StuScore绘制分组条形图
  2. install.packages("vcd")
  3. library(vcd)
  4. fill_colors<-c() #不同的等级,不同的颜色显示
  5. for(i in 1:length(StuScore$Science)){
  6. if(StuScore$Science[i]==100){
  7. fill_colors<-c(fill_colors,"red")
  8. }else if(StuScore$Science[i]<100&&StuScore$Science[i]>=80){
  9. fill_colors<-c(fill_colors,"yellow")
  10. }else if(StuScore$Science[i]<80&&StuScore$Science[i]>=60){
  11. fill_colors<-c(fill_colors,"blue")
  12. }else{
  13. fill_colors<-c(fill_colors,"green")
  14. }
  15. }
  16. barplot(StuScore$Science, #条形图
  17. main="Science Score",
  18. xlab="Name",ylab="ScienceScore",
  19. col=fill_colors,
  20. 20 names.arg=(paste(substr(FirstName,1,1),".",LastName)), #设定横坐标名称
  21. border=NA, #条形框不设置边界线
  22. font.main=4,
  23. font.lab=3,
  24. beside=TRUE)
  25. legend(x=8.8,y=100, #左上角点的坐标
  26. cex=.8, #缩放比例
  27. inset=5,
  28. c("Excellent","Good","Ordinary","Bad"),
  29. pch=c(15,16,17,19), #图例中的符号
  30. col=c("red","yellow","blue","green"),
  31. bg="#821122", #背景色
  32. xpd=TRUE, #可以在绘图区之外显示
  33. text.font=8,
  34. text.width=.6,
  35. text.col=c("red","yellow","blue","green")
  36. )

遇到的问题说明:

  起初在设置了20行的名称时,显示了全名,因此出现了一下情况:

    因为名称太挤,显示不出来。

  解决办法有三:

  1. 保存img时,增大像素值;
  2. 把名词改为简写,即John Davis——>J.Davis
  3. 把名称倾斜,与水平线呈一定的夹角
  4. 利用cex.names=.8对条形图的表情进行微调(减小字号)

  由于3没有找到相应的设置参数,所以这里采用了第二种方法。

  最后的效果图:

R语言(入门小练习篇)的更多相关文章

  1. R语言入门小练习

    要求:模拟产生统计专业同学的名单(学号区分),记录数学,线代,英语三科成绩 > num <- seq(1513032001, 15130320100)                 #模 ...

  2. 用几分钟了解R语言入门知识

    第一篇——用几分钟了解R语言入门知识 第二篇——用几分钟了解R语言入门知识(续) 关于数据分析学习笔记的计划(以及目录)

  3. 【Introduction】R语言入门关键小结

    写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...

  4. R语言学习 第四篇:函数和流程控制

    变量用于临时存储数据,而函数用于操作数据,实现代码的重复使用.在R中,函数只是另一种数据类型的变量,可以被分配,操作,甚至把函数作为参数传递给其他函数.分支控制和循环控制,和通用编程语言的风格很相似, ...

  5. R语言入门1:安装R和RStudio

    R语言入门1:安装R和RStudio 曹务强 中科院遗传学博士研究生 9 人赞同了该文章 1. Windows安装R 在Windows系统上,安装R语言比较简单,直接从R的官方网站下载,按照正常的软件 ...

  6. r语言入门资料

    最近有好多r语言的爱好者问我r语言的事情,在百度上简单的收一收,感觉都在扯淡,真正适合初学者入门的资料几乎没有,比如最开始用什么编辑器比较好,在哪下载,最开始学习的例子有什么?  在日本网站上反倒是找 ...

  7. [原创]零基础R语言教程---第二课---R语言入门

    这节教程简单描述了R语言中常用的数据类型, 向量,字符串,矩阵,列表,数据框,以及附带了一个小例子 对于这节课所附带的例子需要做下列补充: 1.这个例子面向于对整列的数据进行预测 2.如果你需要求单行 ...

  8. c语言入门这一篇就够了-学习笔记(一万字)

    内容来自慕课网,个人学习笔记.加上了mtianyan标签标记知识点. C语言入门 -> Linux C语言编程基本原理与实践 -> Linux C语言指针与内存 -> Linux C ...

  9. R语言入门:向量的运算

    向量之间的加减乘除运算: > x <- 1 > x [1] 1 2 3 4 5 6 7 8 9 10 > x=x+1 > x [1] 2 3 4 5 6 7 8 9 10 ...

随机推荐

  1. 一款标注颜色,距离的小软件 markman

    长度标记   坐标和矩形标记   色值标记   文字标记   长度自动测量   标记拖拽删除   支持多种图片格式 支持PSD(需用最大兼容保存).PNG.BMP.JPG格式 设计稿自动刷新 在标注的 ...

  2. Lemon OA第2篇:功能解析方法

    Lemon OA,整个系统功能也算是比较丰富,OA的很多功能都能看见影子,虽然做得不是很强大 接触Lemon OA,起源于Activiti的学习热情,既然这样,研究Lemon OA的目标有3: 1.L ...

  3. Bind-DLZ with MySQL

    系统环境: 系统:centos 6.8 Mysql: 5.1 BIND: bind--P2.tar.gz IP地址:192.168.153.130 软件下载地址:http://ftp.isc.org/ ...

  4. MySQL ERROR 1045 (28000): Access denied for user 'root'@'localhost'解决

    MySQL ERROR 1045 (28000): Access denied for user 'root'@'localhost'解决: # /etc/init.d/mysql stop # my ...

  5. Java多线程(九)之ReentrantLock与Condition

    一.ReentrantLock 类   1.1 什么是reentrantlock   java.util.concurrent.lock 中的 Lock 框架是锁定的一个抽象,它允许把锁定的实现作为 ...

  6. Dubbo+Zookeeper+Spring整合应用篇-Dubbo基于Zookeeper实现分布式服务(转)

    Dubbo与Zookeeper.Spring整合使用 Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spri ...

  7. Xshell的常用命令

    常用的命令: suse linux 常用命令 (1) 命令ls——列出文件 ls  显示当前目录文件 ls -la 给出当前目录下所有文件的一个长列表,包括以句点开头的“隐藏”文件 ls a* 列出当 ...

  8. ubuntu安装mongo数据库

    安装mongo数据库,在shell下输入 sudo apt-get install mongodb 如果需要在Python中使用mongo数据库,还需要额外安装Python封装库 pip instal ...

  9. SpringBoot整合cxf发布webService

    1. 看看项目结构图 2. cxf的pom依赖 1 <dependency>2 <groupId>org.apache.cxf</groupId>3 <art ...

  10. python 类属性 、实例属性,可变数据结构作为类属性需要注意的地方

    1.一些经典的python错误不去阅读和不重视,就会把错误的做法带入到实际项目中来,甚至造成难以排查问题. 2.有一个大笨猪,按java写观察者模式,java写得是直接在类名下声明一个实例属性(不加s ...