您的位置:首页 > 其它

R语言之数据处理难题的一套解决方案

2016-12-25 20:29 190 查看

用R进行数据处理

来源:现在有这样一些数据:期末考试结束后,学生各科成绩出来了,如何对学生进行评级并将评级结果排序展示?通过以下用R来实现的解决方案,不仅可以学习到R语法相关知识,还能学习到数据处理的思路,而后者明显让我们受益更多。下面转入正题:

第一步:给出学生花名册,含学生姓名和各科成绩

>options(digits=2)                 ---限定输出小数点后数字的位数
>student<-c("Jhon Davis","Angela Williams","Bullwinkle Moose","David Jhons","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)


输出花名册,如下:

student Math Science English
1         Jhon Davis  502      95      25
2    Angela Williams  600      99      22
3   Bullwinkle Moose  412      80      18
4        David Jhons  358      82      15
5  Janice Markhammer  495      75      20
6     Cheryl Cushing  512      85      28
7     Reuven Ytzrhak  410      80      15
8          Greg Knox  625      95      30
9       Joel England  573      89      27
10      Mary Rayburn  522      86      18


第二步:由于数学、科学、英语的分值区间各不相同,均值和标准差相差较大,需要通过标准化、归一化的方法让他们变得可以组合,可以比较。用以下这个方法进行标准化:

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


第三步:通过函数mean()计算各行的均值获得综合得分,使用函数cbind()将其添加到原始数据中。

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


第四步:通过quantile()函数给出学生综合得分的百分位数。

> y<-quantile(roster$score,c(.8,.6,.4,.2))
> y
80%   60%   40%   20%
0.74  0.44 -0.36 -0.89


第五步:使用逻辑运算符,将学生的百分位数排名重新编码为一个类别型成绩变量。

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


第六步:使用函数strsplit()以空格为界把姓名拆分为姓氏和名字,此函数返回一个列表:

> name<-strsplit(roster$student," ")
> name
[[1]]
[1] "Jhon"  "Davis"

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

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

[[4]]
[1] "David" "Jhons"

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

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

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

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

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

[[10]]
[1] "Mary"    "Rayburn"


第七步:使用sapply()函数分别提取上述列表中的第一个元素和第二个元素,分别放入一个储存名字的向量Firstname,Lastname

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


最后:使用order()函数依姓氏和名字对数据集排序:

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


本文到此结束,感谢R语言实战。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  r语言 数据