1 資料的讀入與整理

本單元介紹如何以R語言讀入資料、整理資料、並做初步分析。

1.1 讀入資料

1.1.1 下載範例資料

本單元使用的範例資料為一虛擬的課程成績檔。請下載至本地端。

1.1.2 設定工作目錄

將R的工作目錄設定至存放檔案的目錄下。語法為setwd(“檔案所在地的絕對路徑”),記得資料夾要用\來分隔,例如setwd(“D:\DIR1\DIR2\DIR3”)。設定好之後,可以用getwd()來檢視是否成功。

setwd("D:\\dropbox\\Working\\教師社群")
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。請注意以不同函數讀入資料時,資料的格式會稍有不同,後續在叫出資料時需注意。

library(readxl)
gData <- read_xlsx("成績.xlsx")

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。

gData[c(4:8)] <- sapply(gData[c(4:8)], as.numeric)
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 ...
##  $ 出席        : 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.1 檢視資料的最大最小值

可用max()和min()來檢視總成績的最大最小值。

max(gData1$總成績)
min(gData1$總成績)
## [1] 102.4889
## [1] 45.17778

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.3 取代資料

將總成績大於100者以100取代,總成績不滿60但接近60者以60取代。

gData1[which(gData1$總成績 > 100),'總成績'] <- 100
gData1[which(gData1$總成績 < 60 & gData1$總成績 > 59), '總成績'] <- 60

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.1 儲存為RData檔

以save()函數來將gData1存成gData1.RData檔。

save(gData1, file = "gData1.RData")

1.4.2 儲存為csv檔

以R內建的write.csv()函數儲存為csv檔。

write.csv(gData1, "gData1.csv")

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")