R语言(入门小练习篇)
问题:
一组学生参加了数学、科学和英语考试。为了给所有的学生确定一个单一的成绩衡量指标,需要将这些科目的成绩组合起来。另外,还想将前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数据输入
install.packages("xlsx")
library(xlsx)
workbook<-"D:/R语言/code/R语言实战前五章小试身手/StuScore.xlsx"#也可用‘\\’注意转义字符
StuScore<-read.xlsx(workbook,)#1表示sheet1
StuScore
step2:数据预处理——将变量进行标准化
因为数学,科学和英语考试的分值不同(均值和标准差均有较大差异),在组合之前要让他们变得可以比较
方法:变量标准化,把每科成绩都用单位标准差表示
tips:
所谓数据的标准化是指中心化之后的数据在除以数据集的标准差,即数据集中的各项数据减去数据集的均值再除以数据集的标准差。
例如有数据集1, , , , ,其均值为3,其标准差为1.,那么标准化之后的数据集为(-)/1.87,(-)/1.87,(-)/1.87,(-)/1.87,(-)/1.87,即:-1.069,-0.535,,1.604, 数据中心化和标准化的意义是一样的,为了消除量纲对数据结构的影响。
这里使用scale()可以直接实现
> #2数据预处理
> options(digits=)#限定为2位小数
> afterscale<-scale(StuScore[,:])
> afterscale
Math Science English
[,] -0.58 1.040 0.20
[,] -1.02 -0.815 -1.17
[,] 0.82 -0.086 -0.12
[,] 0.28 -0.881 -0.54
[,] -1.15 1.106 -0.86
[,] 0.98 0.643 0.73
[,] 0.29 -0.086 1.47
[,] -1.54 -1.544 -1.17
[,] 0.56 -0.749 -0.12
[,] 1.35 1.372 1.57
attr(,"scaled:center")
Math Science English attr(,"scaled:scale")
Math Science English
84.7 15.1 9.5
这里,有两个疑问:
1.说好的输出两位小数呢?Science那一栏输出的都是三位小数,怎么回事?
2.这是什么东东?
attr(,"scaled:center")
Math Science English attr(,"scaled:scale")
Math Science English
84.7 15.1 9.5scale方法中的两个参数center和scale的解释:
1.center和scale默认为真,即T或者TRUE
2.center为真表示数据中心化
3.scale为真表示数据标准化
也就是说:center表示一列数据的均值,scale则表示标准差(有兴趣的同学,可以用Excel的STDEV函数验证一下)
step3:通过函数mean()来计算各行的均值以及获得综合得分,并使用cbind()将其添加到花名册中
> #3在afterscale中计算标准差均值,并将其添加到StuScore
> score<-apply(afterscale,,mean)#1表示行,mean表示均值函数
> StuScore<-cbind(StuScore,score)
> StuScore
StuId StuName Math Science English score
John Davis 0.22
Angela Williams -1.00
Bull Jones 0.21
Cheryl Cushing -0.38
Reuven Ytzrhak -0.30
Joel Knox 0.78
Mary Rayburn 0.56
Greg England -1.42
Brad Tmac -0.10
Tracy Mcgrady 1.43
Step4:函数quantile()给出学生综合得分的百分位数
quantile(x,probs):求分位数,其中x为待求分位数的数值型向量,probs为一个由[0,1]之间的概率值组成的数值向量
> afterquantile<-quantile(score,c(.,.,.,.))
> afterquantile
% % % %
0.60 0.21 -0.18 -0.50
step5:使用逻辑运算符,把score转为等级(离散型)
> #5使用逻辑运算符,把score转为等级(离散型)
> StuScore$grade[score>=afterquantile[]]<-"A"
> StuScore$grade[score<afterquantile[]&&score>=afterquantile[]]<-"B"
> StuScore$grade[score<afterquantile[]&&score>=afterquantile[]]<-"C"
> StuScore$grade[score<afterquantile[]&&score>=afterquantile[]]<-"D"
> StuScore$grade[score<afterquantile[]]<-"E"
> StuScore
StuId StuName Math Science English score grade
John Davis 0.22 B
Angela Williams -1.00 E
Bull Jones 0.21 B
Cheryl Cushing -0.38 E
Reuven Ytzrhak -0.30 E
Joel Knox 0.78 B
Mary Rayburn 0.56 B
Greg England -1.42 E
Brad Tmac -0.10 E
Tracy Mcgrady 1.43 B
Step6:使用strsplit()以空格为界把学生姓名拆分为姓氏和名字
> #Step6:使用strsplit()以空格为界把学生姓名拆分为姓氏和名字
> name<-strsplit((StuScore$StuName)," ")
Error in strsplit((StuScore$StuName), " ") : non-character argument
> name
[] "Jim" "Tony" "Lisa" "Tom"
这里出错了,原因很明确,没有字符型的参数传入,反应过来,原来是用execl导入的时候,StuName那一列默认的是什么类型的呢?我们来检测一下
> is.numeric(StuScore$StuName)
[] FALSE
> is.logical(StuScore$StuName)
[] FALSE
> is.character(StuScore$StuName)
[] FALSE
> is.complex(StuScore$StuName)
[] FALSE
> help(type)
> typeof(StuScore$StuName)
[] "integer"
因此,我们把他改为字符型
> #Step6:使用strsplit()以空格为界把学生姓名拆分为姓氏和名字
> StuScore$StuName<-as.character(StuScore$StuName)
> is.character(StuScore$StuName)
[] TRUE
> name<-strsplit(StuScore$StuName," ")
> name
[[]]
[] "John" "Davis" [[]]
[] "Angela" "Williams" [[]]
[] "Bull" "Jones" [[]]
[] "Cheryl" "Cushing" [[]]
[] "Reuven" "Ytzrhak" [[]]
[] "Joel" "Knox" [[]]
[] "Mary" "Rayburn" [[]]
[] "Greg" "England" [[]]
[] "Brad" "Tmac" [[]]
[] "Tracy" "Mcgrady"
Step7:把name分成Firstname和LastName,加入到StuScore中
> #7把name分成Firstname和LastName,加入到StuScore中
> FirstName<-sapply(name,"[",)
> LastName<-sapply(name,"[",)
> StuScore<-cbind(FirstName,LastName,StuScore[,-])
> StuScore
FirstName LastName LastName StuName Math Science English score grade
John Davis Davis John Davis 0.22 B
Angela Williams Williams Angela Williams -1.00 E
Bull Jones Jones Bull Jones 0.21 B
Cheryl Cushing Cushing Cheryl Cushing -0.38 E
Reuven Ytzrhak Ytzrhak Reuven Ytzrhak -0.30 E
Joel Knox Knox Joel Knox 0.78 B
Mary Rayburn Rayburn Mary Rayburn 0.56 B
Greg England England Greg England -1.42 E
Brad Tmac Tmac Brad Tmac -0.10 E
Tracy Mcgrady Mcgrady Tracy Mcgrady 1.43 B
>
Step8:order排序
> #8order()排序
> StuScore[order(LastName,FirstName),]
FirstName LastName LastName StuName Math Science English score grade
Cheryl Cushing Cushing Cheryl Cushing -0.38 E
John Davis Davis John Davis 0.22 B
Greg England England Greg England -1.42 E
Bull Jones Jones Bull Jones 0.21 B
Joel Knox Knox Joel Knox 0.78 B
Tracy Mcgrady Mcgrady Tracy Mcgrady 1.43 B
Mary Rayburn Rayburn Mary Rayburn 0.56 B
Brad Tmac Tmac Brad Tmac -0.10 E
Angela Williams Williams Angela Williams -1.00 E
Reuven Ytzrhak Ytzrhak Reuven Ytzrhak -0.30 E
>
虽然是照着书本上做的,但是,代码必须要自己敲一遍,过程中遇到的一些小问题也解决了,就算菜鸟简单入门。这样样例还可以继续拓展,把R语言实战前5章的内容尽可能用一边,可以绘制一些图,等等,本文还会继续更新。
为ScienceScore绘制条形图
根据不同的分数等级,显示不同的颜色。
#为StuScore绘制分组条形图
install.packages("vcd")
library(vcd)
fill_colors<-c() #不同的等级,不同的颜色显示
for(i in 1:length(StuScore$Science)){
if(StuScore$Science[i]==100){
fill_colors<-c(fill_colors,"red")
}else if(StuScore$Science[i]<100&&StuScore$Science[i]>=80){
fill_colors<-c(fill_colors,"yellow")
}else if(StuScore$Science[i]<80&&StuScore$Science[i]>=60){
fill_colors<-c(fill_colors,"blue")
}else{
fill_colors<-c(fill_colors,"green")
}
}
barplot(StuScore$Science, #条形图
main="Science Score",
xlab="Name",ylab="ScienceScore",
col=fill_colors,
20 names.arg=(paste(substr(FirstName,1,1),".",LastName)), #设定横坐标名称
border=NA, #条形框不设置边界线
font.main=4,
font.lab=3,
beside=TRUE)
legend(x=8.8,y=100, #左上角点的坐标
cex=.8, #缩放比例
inset=5,
c("Excellent","Good","Ordinary","Bad"),
pch=c(15,16,17,19), #图例中的符号
col=c("red","yellow","blue","green"),
bg="#821122", #背景色
xpd=TRUE, #可以在绘图区之外显示
text.font=8,
text.width=.6,
text.col=c("red","yellow","blue","green")
)
遇到的问题说明:
起初在设置了20行的名称时,显示了全名,因此出现了一下情况:
因为名称太挤,显示不出来。
解决办法有三:
- 保存img时,增大像素值;
- 把名词改为简写,即John Davis——>J.Davis
- 把名称倾斜,与水平线呈一定的夹角
- 利用cex.names=.8对条形图的表情进行微调(减小字号)
由于3没有找到相应的设置参数,所以这里采用了第二种方法。
最后的效果图:
R语言(入门小练习篇)的更多相关文章
- R语言入门小练习
要求:模拟产生统计专业同学的名单(学号区分),记录数学,线代,英语三科成绩 > num <- seq(1513032001, 15130320100) #模 ...
- 用几分钟了解R语言入门知识
第一篇——用几分钟了解R语言入门知识 第二篇——用几分钟了解R语言入门知识(续) 关于数据分析学习笔记的计划(以及目录)
- 【Introduction】R语言入门关键小结
写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...
- R语言学习 第四篇:函数和流程控制
变量用于临时存储数据,而函数用于操作数据,实现代码的重复使用.在R中,函数只是另一种数据类型的变量,可以被分配,操作,甚至把函数作为参数传递给其他函数.分支控制和循环控制,和通用编程语言的风格很相似, ...
- R语言入门1:安装R和RStudio
R语言入门1:安装R和RStudio 曹务强 中科院遗传学博士研究生 9 人赞同了该文章 1. Windows安装R 在Windows系统上,安装R语言比较简单,直接从R的官方网站下载,按照正常的软件 ...
- r语言入门资料
最近有好多r语言的爱好者问我r语言的事情,在百度上简单的收一收,感觉都在扯淡,真正适合初学者入门的资料几乎没有,比如最开始用什么编辑器比较好,在哪下载,最开始学习的例子有什么? 在日本网站上反倒是找 ...
- [原创]零基础R语言教程---第二课---R语言入门
这节教程简单描述了R语言中常用的数据类型, 向量,字符串,矩阵,列表,数据框,以及附带了一个小例子 对于这节课所附带的例子需要做下列补充: 1.这个例子面向于对整列的数据进行预测 2.如果你需要求单行 ...
- c语言入门这一篇就够了-学习笔记(一万字)
内容来自慕课网,个人学习笔记.加上了mtianyan标签标记知识点. C语言入门 -> Linux C语言编程基本原理与实践 -> Linux C语言指针与内存 -> Linux C ...
- 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 ...
随机推荐
- e779. 获得JList中的已选项
The following methods return the indices of the selected items: // To create a list, see e774 创建JLis ...
- 开源轻量级分布式文件系统--FastDFS
FastDFS一个高效的分布式文件系统 分布式文件系统FastDFS原理介绍 分布式文件系统FastDFS设计原理 FastDFS安装.配置.部署(一)-安装和部署 分布式文件系统 - FastDFS ...
- Winform控件学习笔记【第四天】——WebBrowser
常用方法 Navigate(string urlString);//浏览urlString表示的网址 Navigate(System.Uri url);//浏览url表示的网址 Navigate(st ...
- VS2013 此模板尝试加载组件程序集”NuGet.VisualStudio.interop,Version=1.0.0.0 的解决办法
此模板尝试加载组件程序集 NuGet.VisualStudio.Interop 分析错误 既然错误信息提示模板尝试加载组件程序集,那说明NuGet.VisualStudio.Interop程序集不 ...
- 定时任务quartz与spring的集成
我想要在spring的集成框架中使用spring , 暂时采用quartz 根据下面的几篇博客实现了(懒得说了,直接丢链接): Quartz实现动态定时任务 Spring 3整合Quartz 2实现定 ...
- windows版mysql配置--my.ini
完整配置如下: # power by phpStudy 2014 www.phpStudy.net 官网下载最新版 [client] port=3306 [mysql] [mysqld] port=3 ...
- Dockerfile 常用指令
下面列出了 Dockerfile 中最常用的指令,完整列表和说明可参看官方文档. FROM指定 base 镜像. MAINTAINER设置镜像的作者,可以是任意字符串. COPY将文件从 build ...
- 手机端网页使用html5地理定位获取位置失败的解决办法
网上有很多关于html5 geolocation 获取地理定位的方法,我试了下,只有在IE edge浏览器可以成功获取到,在chrome,firefox,手机端的safari,QQ浏览器,微信浏览器, ...
- TensorFlow安装,升级,基本操作
一. 安装 ubuntu 16 python 2.7 pip install tensorflow 测试安装完成效果: 查看tensorFlow版本python import tensorflow a ...
- Node.js 模块之 morgan中间件记录日志
NodeJs中Express框架使用morgan中间件记录日志 Express中的app.js文件已经默认引入了该中间件var logger = require('morgan'); 使用app.us ...