1 資料的讀入與整理
本單元介紹如何以R語言讀入資料、整理資料、並做初步分析。
1.1 讀入資料
1.1.1 下載範例資料
本單元使用的範例資料為一虛擬的課程成績檔。請下載至本地端。
1.1.2 設定工作目錄
將R的工作目錄設定至存放檔案的目錄下。語法為setwd(“檔案所在地的絕對路徑”),記得資料夾要用\來分隔,例如setwd(“D:\DIR1\DIR2\DIR3”)。設定好之後,可以用getwd()來檢視是否成功。
## [1] "D:/Dropbox/Working/教師社群"
1.1.3 讀入檔案
以xlsx套件的read.xlsx()函數來讀入excel檔,此函數有賴java。
library(xlsx)
gData <- read.xlsx("成績.xlsx", 1, encoding = "UTF-8", stringsAsFactors=FALSE)
head(gData)
## 學號 性別 組別 出席 影片團評 影片老師評分 期中考 期末考
## 1 102368014 M 9 8.5 24.05 8.5 32 28
## 2 102368018 M 10 9.5 24.26 8.5 66 59
## 3 102368024 F 9 8 24.05 8.5 69 68
## 4 102368027 F 9 8 24.05 8.5 68 83.5
## 5 102368030 F 11 0 18.92 7 39 30
## 6 100368033 M 4 12 20 8 58 79
也可以用readxl套件的read_xlsx()函數來讀入excel檔,此函數不需java。請注意以不同函數讀入資料時,資料的格式會稍有不同,後續在叫出資料時需注意。
1.2 資料檢視
資料中,有兩位學生已退選,不納入成績計算,可先刪除不要的資料(即選擇要的資料)。
gData <- gData[gData$期末考 != ".", ]
1.2.1 檢視資料類型
可在RStudio右方的Environment中雙擊變項名稱來檢視變項,變項為dataframe的型式。 或使用str(變項名稱)來檢視dataframe下的每個變項類型。
str(gData)
## 'data.frame': 57 obs. of 8 variables:
## $ 學號 : chr "102368014" "102368018" "102368024" "102368027" ...
## $ 性別 : chr "M" "M" "F" "F" ...
## $ 組別 : num 9 10 9 9 11 4 4 4 6 6 ...
## $ 出席 : chr "8.5" "9.5" "8" "8" ...
## $ 影片團評 : chr "24.05" "24.26" "24.05" "24.05" ...
## $ 影片老師評分: chr "8.5" "8.5" "8.5" "8.5" ...
## $ 期中考 : chr "32" "66" "69" "68" ...
## $ 期末考 : chr "28" "59" "68" "83.5" ...
1.2.2 資料類型的轉換
將資料中,出席至期末考的類型從文字轉為數字。
以期中考為例,可用as.numeric()來做轉換。
gData$期中考 <- as.numeric(gData$期中考)
str(gData)
## 'data.frame': 57 obs. of 8 variables:
## $ 學號 : chr "102368014" "102368018" "102368024" "102368027" ...
## $ 性別 : chr "M" "M" "F" "F" ...
## $ 組別 : num 9 10 9 9 11 4 4 4 6 6 ...
## $ 出席 : chr "8.5" "9.5" "8" "8" ...
## $ 影片團評 : chr "24.05" "24.26" "24.05" "24.05" ...
## $ 影片老師評分: chr "8.5" "8.5" "8.5" "8.5" ...
## $ 期中考 : num 32 66 69 68 39 58 67 55 40 54 ...
## $ 期末考 : chr "28" "59" "68" "83.5" ...
若要一次轉換多個變項,可用sapply。
## 'data.frame': 57 obs. of 8 variables:
## $ 學號 : chr "102368014" "102368018" "102368024" "102368027" ...
## $ 性別 : chr "M" "M" "F" "F" ...
## $ 組別 : num 9 10 9 9 11 4 4 4 6 6 ...
## $ 出席 : num 8.5 9.5 8 8 0 12 12 5 12 12 ...
## $ 影片團評 : num 24.1 24.3 24.1 24.1 18.9 ...
## $ 影片老師評分: num 8.5 8.5 8.5 8.5 7 8 8 8 8 8 ...
## $ 期中考 : num 32 66 69 68 39 58 67 55 40 54 ...
## $ 期末考 : num 28 59 68 83.5 30 79 78 56.5 49.5 60.5 ...
1.2.3 檢視各組人數
可用table()來檢視男女人數和各組人數。
table(gData$性別)
gTable1 <- as.data.frame(table(gData$性別))
gTable2 <- as.data.frame(table(gData$組別))
gTable1
##
## F M
## 30 27
## Var1 Freq
## 1 F 30
## 2 M 27
檢視各組中的男女人數。
table(gData$性別, gData$組別)
as.data.frame(rbind(table(gData$性別, gData$組別)))
##
## 1 2 3 4 5 6 7 8 9 10 11 12
## F 1 4 5 4 2 2 3 1 2 2 3 1
## M 3 2 2 2 3 3 1 4 1 3 1 2
## 1 2 3 4 5 6 7 8 9 10 11 12
## F 1 4 5 4 2 2 3 1 2 2 3 1
## M 3 2 2 2 3 3 1 4 1 3 1 2
1.3 分數的轉換和計算
因影片的評分分別為滿分30分(團評)和滿分10分(老師評分),須轉換為百分制並加以平均。
1.3.1 換為百分制
將影片團評和老師評分轉換為百分制。
gData$影片團評新 <- gData$影片團評 / 30 * 100
gData$影片老師評分新 <- gData$影片老師評分 / 10 * 100
head(gData)
## 學號 性別 組別 出席 影片團評 影片老師評分 期中考 期末考 影片團評新
## 1 102368014 M 9 8.5 24.05 8.5 32 28.0 80.16667
## 2 102368018 M 10 9.5 24.26 8.5 66 59.0 80.86667
## 3 102368024 F 9 8.0 24.05 8.5 69 68.0 80.16667
## 4 102368027 F 9 8.0 24.05 8.5 68 83.5 80.16667
## 5 102368030 F 11 0.0 18.92 7.0 39 30.0 63.06667
## 6 100368033 M 4 12.0 20.00 8.0 58 79.0 66.66667
## 影片老師評分新
## 1 85
## 2 85
## 3 85
## 4 85
## 5 70
## 6 80
1.3.2 將兩變項平均
直接相加除以2或用rowMeans()來做都可以。
gData$影片 <- (gData$影片團評新 + gData$影片老師評分新)/2
gData$影片 <- rowMeans(gData[,c("影片團評新", "影片老師評分新")], na.rm=TRUE)
head(gData)
## 學號 性別 組別 出席 影片團評 影片老師評分 期中考 期末考 影片團評新
## 1 102368014 M 9 8.5 24.05 8.5 32 28.0 80.16667
## 2 102368018 M 10 9.5 24.26 8.5 66 59.0 80.86667
## 3 102368024 F 9 8.0 24.05 8.5 69 68.0 80.16667
## 4 102368027 F 9 8.0 24.05 8.5 68 83.5 80.16667
## 5 102368030 F 11 0.0 18.92 7.0 39 30.0 63.06667
## 6 100368033 M 4 12.0 20.00 8.0 58 79.0 66.66667
## 影片老師評分新 影片
## 1 85 82.58333
## 2 85 82.93333
## 3 85 82.58333
## 4 85 82.58333
## 5 70 66.53333
## 6 80 73.33333
1.3.3 抽取部份資料加以計算
抽取出最後要分析的變項,使資料更簡潔。抽取資料的兩種方法為:(1) 資料框名稱[列,行];(2)subset(變項名稱, 行的條件, select=c(列的名稱))。
gData1 <- gData[,-c(5,6,9,10)]
gData1 <- subset(gData, select = c("學號", "性別", "組別", "出席", "影片", "期中考", "期末考"))
head(gData1)
## 學號 性別 組別 出席 影片 期中考 期末考
## 1 102368014 M 9 8.5 82.58333 32 28.0
## 2 102368018 M 10 9.5 82.93333 66 59.0
## 3 102368024 F 9 8.0 82.58333 69 68.0
## 4 102368027 F 9 8.0 82.58333 68 83.5
## 5 102368030 F 11 0.0 66.53333 39 30.0
## 6 100368033 M 4 12.0 73.33333 58 79.0
假設總成績為期中考+期末考+影片的平均,再加上出席分數,則可以下列方式計算。
gData1$總成績 <- (gData1$期中考 + gData1$期末考 + gData1$影片)/3 + gData1$出席
head(gData1)
## 學號 性別 組別 出席 影片 期中考 期末考 總成績
## 1 102368014 M 9 8.5 82.58333 32 28.0 56.02778
## 2 102368018 M 10 9.5 82.93333 66 59.0 78.81111
## 3 102368024 F 9 8.0 82.58333 69 68.0 81.19444
## 4 102368027 F 9 8.0 82.58333 68 83.5 86.02778
## 5 102368030 F 11 0.0 66.53333 39 30.0 45.17778
## 6 100368033 M 4 12.0 73.33333 58 79.0 82.11111
1.3.4 資料數值的檢視與取代
檢視總成績資料,將大於100和小於60者挑選出來,並以新成績取代。
1.3.4.2 找出符合條件的資料
以which()找出大於100和小於60的資料位置,並叫出來看。
gData1[which(gData1$總成績 < 60),]
## 學號 性別 組別 出席 影片 期中考 期末考 總成績
## 1 102368014 M 9 8.5 82.58333 32 28 56.02778
## 5 102368030 F 11 0.0 66.53333 39 30 45.17778
## 48 103368042 F 4 8.0 73.33333 45 0 47.44444
## 51 103368047 M 12 5.0 77.11667 52 35 59.70556
## 58 103365306 F 11 12.0 66.53333 29 47 59.51111
gData1[which(gData1$總成績 > 100),]
## 學號 性別 組別 出席 影片 期中考 期末考 總成績
## 43 103368037 M 5 12 82.46667 89 100 102.4889
1.3.4.4 確認執行結果
用which檢視還有哪些學生總成績小於60或大於100。
gData1[which(gData1$總成績 < 60),]
## 學號 性別 組別 出席 影片 期中考 期末考 總成績
## 1 102368014 M 9 8.5 82.58333 32 28 56.02778
## 5 102368030 F 11 0.0 66.53333 39 30 45.17778
## 48 103368042 F 4 8.0 73.33333 45 0 47.44444
gData1[which(gData1$總成績 > 100),]
## [1] 學號 性別 組別 出席 影片 期中考 期末考 總成績
## <0 rows> (or 0-length row.names)
檢視原來59分的兩位學生的成績。
gData1[which(gData1$學號 == "103368047" | gData1$學號 == "103365306"),]
## 學號 性別 組別 出席 影片 期中考 期末考 總成績
## 51 103368047 M 12 5 77.11667 52 35 60
## 58 103365306 F 11 12 66.53333 29 47 60
1.4 儲存資料
可將dataframe儲存成RData、txt、dat、csv、excel等不同類型的檔案。
1.4.3 儲存為excel檔
可用xlsx套件的write.xlsx()函數將資料存為excel檔,或用writexl套件的write_xlsx()函數來儲存。前者有賴java的運作,後者則不需java。
library(xlsx)
write.xlsx(gData1, file="gData1.xlsx")
library(writexl)
write_xlsx(gData1, "gData1.xlsx")