R处理数据的案例

将学生的各科考试成绩组合为单一的成绩衡量指标、基于相对名次(前

20%,下20%,等等)给出从A到F的评分、根据学生姓氏和名字的首字母对花名册进行排序

代码如下:

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)
head(roster)

tail(roster)
z<-scale(roster[,2:4])

score<-apply(z, 1, mean)

roster<-cbind(roster,score)

help(quantile)

y<-quantile(score,c(.8,.6,.4,.2))

str(y)

roster$grade[score>=y[1]]<- "A"
roster$grade[score=y[2]]<-"B"

roster$grade[score=y[3]]<-"C"

roster$grade[score=y[4]]<-"D"

roster$grade[score

以上代码写得比较紧凑,逐步分解如下。
步骤1 原始的学生花名册已经给出了。options(digits=2)限定了输出小数点后数字的位数,

并且让输出更容易阅读。

步骤2 由于数学、科学和英语考试的分值不同(均值和标准差相去甚远),在组合之前需
要先让它们变得可以比较。一种方法是将变量进行标准化,这样每科考试的成绩就都是用单位标
准差来表示,而不是以原始的尺度来表示了。这个过程可以使用scale()函数来实现。

 z
        Math Science English
 [1,]  0.013   1.078   0.587
 [2,]  1.143   1.591   0.037
 [3,] -1.026  -0.847  -0.697
 [4,] -1.649  -0.590  -1.247
 [5,] -0.068  -1.489  -0.330
 [6,]  0.128  -0.205   1.137
 [7,] -1.049  -0.847  -1.247
 [8,]  1.432   1.078   1.504
 [9,]  0.832   0.308   0.954
 [10,]  0.243  -0.077  -0.697
步骤3 然后,可以通过函数mean()来计算各行的均值以获得综合得分,并使用函数
cbind()将其添加到花名册中:

 >roster[,-9]
    fristname   lastname lastname.1 Math Science English score 
5      Cheryl    Cushing Markhammer  495      75      20 -0.63    
6        John      Davis    Cushing  512      85      28  0.35     
2        Joel    England   Williams  600      99      22  0.92    
4       David      Jones      Jones  358      82      15 -1.16     
10       Greg       Knox    Rayburn  522      86      18 -0.18     
8      Janice Markhammer       Knox  625      95      30  1.34    
9  Bullwinkle      Moose    England  573      89      27  0.70     
7        Mary    Rayburn    Ytzrhak  410      80      15 -1.05     
1      Angela   Williams      Davis  502      95      25  0.56     
3      Reuven    Ytzrhak      Moose  412      80      18 -0.86     

步骤4 函数quantile()给出了学生综合得分的百分位数。可以看到,成绩为A的分界点
为0.74,B的分界点为0.44,等等。
> y
  80%   60%   40%   20% 
 0.74  0.44 -0.36 -0.89 

步骤5 通过使用逻辑运算符,你可以将学生的百分位数排名重编码为一个新的类别型成绩
变量。下面在数据框roster中创建了变量grade

步骤6 你将使用函数strsplit()以空格为界把学生姓名拆分为姓氏和名字。把strsplit()
应用到一个字符串组成的向量上会返回一个列表:

name<-strsplit((roster$Student)," ")

> name
[[1]]
[1] "John"  "Davis"

[[2]]
[1] "Angela"   "Williams"

[[3]]
[1] "Bullwinkle" "Moose"     

[[4]]
[1] "David" "Jones"

[[5]]
[1] "Janice"     "Markhammer"

[[6]]
[1] "Cheryl"  "Cushing"

[[7]]
[1] "Reuven"  "Ytzrhak"

[[8]]
[1] "Greg" "Knox"

[[9]]
[1] "Joel"    "England"

[[10]]
[1] "Mary"    "Rayburn"
步骤7 你可以使用函数sapply()提取列表中每个成分的第一个元素,放入一个储存名字
的向量,并提取每个成分的第二个元素,放入一个储存姓氏的向量。"["是一个可以提取某个对
象的一部分的函数——在这里它是用来提取列表name各成分中的第一个或第二个元素的。你将
使用cbind()把它们添加到花名册中。由于已经不再需要student变量,可以将其丢弃(在下标
中使用1)。
步骤8 最后,可以使用函数order()依姓氏和名字对数据集进行排序.

> roster[,-9]
    fristname   lastname lastname.1 Math Science English score grade
5      Cheryl    Cushing Markhammer  495      75      20 -0.63     C
6        John      Davis    Cushing  512      85      28  0.35     B
2        Joel    England   Williams  600      99      22  0.92     B
4       David      Jones      Jones  358      82      15 -1.16     F
10       Greg       Knox    Rayburn  522      86      18 -0.18     A
8      Janice Markhammer       Knox  625      95      30  1.34     D
9  Bullwinkle      Moose    England  573      89      27  0.70     D
7        Mary    Rayburn    Ytzrhak  410      80      15 -1.05     C
1      Angela   Williams      Davis  502      95      25  0.56     A
3      Reuven    Ytzrhak      Moose  412      80      18 -0.86     F


你可能感兴趣的:(数据处理--R语言,R_数据分析)