首页 > 代码库 > R语言(入门小练习篇)

R语言(入门小练习篇)

问题:

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

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

  

StuIdStuNameMathScienceEnglish
1John Davis5029525
2Angela Williams4656712
3Bull Jones6217822
4Cheryl Cushing5756618
5Reuven Ytzrhak4549615
6Joel Knox6348930
7Mary Rayburn5767837
8Greg England4215612
9Brad Tmac5996822
10Tracy Mcgrady66610038

 

 

 

 

 

 

 

 

                                                                                   

 

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)#1表示sheet16 StuScore

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

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

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

  tips:

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

 

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

 1 > #2数据预处理 2 > options(digits=2)#限定为2位小数 3 > afterscale<-scale(StuScore[,3:5]) 4 > afterscale 5        Math Science English 6  [1,] -0.58   1.040    0.20 7  [2,] -1.02  -0.815   -1.17 8  [3,]  0.82  -0.086   -0.12 9  [4,]  0.28  -0.881   -0.5410  [5,] -1.15   1.106   -0.8611  [6,]  0.98   0.643    0.7312  [7,]  0.29  -0.086    1.4713  [8,] -1.54  -1.544   -1.1714  [9,]  0.56  -0.749   -0.1215 [10,]  1.35   1.372    1.5716 attr(,"scaled:center")17    Math Science English 18     551      79      23 19 attr(,"scaled:scale")20    Math Science English 21    84.7    15.1     9.5 

  这里,有两个疑问:

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

    

  2.这是什么东东?

  1. 1 attr(,"scaled:center")2    Math Science English 3     551      79      23 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,1,mean)#1表示行,mean表示均值函数 3 > StuScore<-cbind(StuScore,score) 4 > StuScore 5    StuId         StuName Math Science English score 6 1      1      John Davis  502      95      25  0.22 7 2      2 Angela Williams  465      67      12 -1.00 8 3      3      Bull Jones  621      78      22  0.21 9 4      4  Cheryl Cushing  575      66      18 -0.3810 5      5  Reuven Ytzrhak  454      96      15 -0.3011 6      6       Joel Knox  634      89      30  0.7812 7      7    Mary Rayburn  576      78      37  0.5613 8      8    Greg England  421      56      12 -1.4214 9      9       Brad Tmac  599      68      22 -0.1015 10    10   Tracy Mcgrady  666     100      38  1.43

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

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

1 > afterquantile<-quantile(score,c(.8,.6,.4,.2))2 > afterquantile3   80%   60%   40%   20% 4  0.60  0.21 -0.18 -0.50 

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

 1 > #5使用逻辑运算符,把score转为等级(离散型) 2 > StuScore$grade[score>=afterquantile[1]]<-"A" 3 > StuScore$grade[score<afterquantile[1]&&score>=afterquantile[2]]<-"B" 4 > StuScore$grade[score<afterquantile[2]&&score>=afterquantile[3]]<-"C" 5 > StuScore$grade[score<afterquantile[3]&&score>=afterquantile[4]]<-"D" 6 > StuScore$grade[score<afterquantile[4]]<-"E" 7 > StuScore 8    StuId         StuName Math Science English score grade 9 1      1      John Davis  502      95      25  0.22     B10 2      2 Angela Williams  465      67      12 -1.00     E11 3      3      Bull Jones  621      78      22  0.21     B12 4      4  Cheryl Cushing  575      66      18 -0.38     E13 5      5  Reuven Ytzrhak  454      96      15 -0.30     E14 6      6       Joel Knox  634      89      30  0.78     B15 7      7    Mary Rayburn  576      78      37  0.56     B16 8      8    Greg England  421      56      12 -1.42     E17 9      9       Brad Tmac  599      68      22 -0.10     E18 10    10   Tracy Mcgrady  666     100      38  1.43     B

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

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

 

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

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

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

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

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

 1 > #7把name分成Firstname和LastName,加入到StuScore中 2 > FirstName<-sapply(name,"[",1) 3 > LastName<-sapply(name,"[",2) 4 > StuScore<-cbind(FirstName,LastName,StuScore[,-1]) 5 > StuScore 6    FirstName LastName LastName         StuName Math Science English score grade 7 1       John    Davis    Davis      John Davis  502      95      25  0.22     B 8 2     Angela Williams Williams Angela Williams  465      67      12 -1.00     E 9 3       Bull    Jones    Jones      Bull Jones  621      78      22  0.21     B10 4     Cheryl  Cushing  Cushing  Cheryl Cushing  575      66      18 -0.38     E11 5     Reuven  Ytzrhak  Ytzrhak  Reuven Ytzrhak  454      96      15 -0.30     E12 6       Joel     Knox     Knox       Joel Knox  634      89      30  0.78     B13 7       Mary  Rayburn  Rayburn    Mary Rayburn  576      78      37  0.56     B14 8       Greg  England  England    Greg England  421      56      12 -1.42     E15 9       Brad     Tmac     Tmac       Brad Tmac  599      68      22 -0.10     E16 10     Tracy  Mcgrady  Mcgrady   Tracy Mcgrady  666     100      38  1.43     B17 > 

Step8:order排序

 1 > #8order()排序 2 > StuScore[order(LastName,FirstName),] 3    FirstName LastName LastName         StuName Math Science English score grade 4 4     Cheryl  Cushing  Cushing  Cheryl Cushing  575      66      18 -0.38     E 5 1       John    Davis    Davis      John Davis  502      95      25  0.22     B 6 8       Greg  England  England    Greg England  421      56      12 -1.42     E 7 3       Bull    Jones    Jones      Bull Jones  621      78      22  0.21     B 8 6       Joel     Knox     Knox       Joel Knox  634      89      30  0.78     B 9 10     Tracy  Mcgrady  Mcgrady   Tracy Mcgrady  666     100      38  1.43     B10 7       Mary  Rayburn  Rayburn    Mary Rayburn  576      78      37  0.56     B11 9       Brad     Tmac     Tmac       Brad Tmac  599      68      22 -0.10     E12 2     Angela Williams Williams Angela Williams  465      67      12 -1.00     E13 5     Reuven  Ytzrhak  Ytzrhak  Reuven Ytzrhak  454      96      15 -0.30     E14 > 

 

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