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处理数据难题的一套解决方案
- 串口通信中接收数据时延迟处理与缓存处理的解决方案(C#)
- 串口通信中接收数据时延迟处理与缓存处理的解决方案(C#)
- 【转】R语言处理缺失数据的高级方法
- R语言plyr包——超越apply族的数据分块处理包
- R语言与mysql结合处理交通数据及其算法优化
- 分页处理大量数据microsoft解决方案
- wedata系列------从0开始搭建一套数据处理系统
- R语言处理缺失数据的高级方法
- 大数据环境下基于R语言的数据挖掘平台 之 大数据处理与导出模块
- R语言处理缺失数据的高级方法
- 大数据处理两套解决方案
- 大数据下xapian建索引速度问题可能的解决方案以及索引数据的压缩处理
- 千万级数据处理解决方案(收集)
- R语言之处理数据(一)
- 串口通信中接收数据时延迟处理与缓存处理的解决方案(C#)
- 串口通信中接收数据时延迟处理与缓存处理的解决方案(C#)
- 大数据处理解决方案整理
- Hibernate在处理数据量比较大的时候内存不释放的解决方案
- java处理大数据的一个优化解决方案