1. 程式人生 > >R語言之資料處理難題的一套解決方案

R語言之資料處理難題的一套解決方案

用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語言實戰。