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