評分標準

  1. 錯一個地方扣五分,超過三個錯就沒有A。
  2. 有些同學一開始問卷key in有誤,導致讀檔時讀成錯誤的資料。這種情況,如果語法是對的,也有跑出合理的結果,不會全扣。不過很顯然後面的分析結果完全仰賴前面資料輸入及預處理是否正確,因此請大家千萬要小心,不論是現在寫作業,或是將來大家在做研究的時候。
  3. 詮釋的部分,只寫到「女生比男生更經常討論」不算是詮釋。

作業講解

#install.packages("carData")
#install.packages("foreign")
library(carData)
library(foreign)

setwd("/Users/yyaaabbeee/Desktop/TA")

mydata_a <- read.fwf("2008a.txt",
                     widths = c(3,4,1,1,1,2,1,1,1,2,2,2,3,3,3,1,1,1,1,1,1,1,1,1,1))
mydata_b <- read.fwf("2008b.txt",
                     widths = c(3,4,1,1,1,2,1,1,1,2,2,2,3,3,3,1,1,1,1,1,1,1,1,1,1))
mydata_c <- read.fwf("2009.txt",
                     widths =c(3,4,1,1,2,2,1,1,1,1,1,1,1,1))

資料合併

mydata_ab <- rbind(mydata_a, mydata_b)

#dimnames(mydata)[[1]]是row的名稱;dimnames(mydata)[[2]]是column的名稱
dimnames(mydata_ab)[[2]] <- c("ID","DEPT","YEAR","GENDER","KNOW","CREDIT","WORK","HIGH2","HIGH3","FEB_CHI","FEB_ENG","FEB_MAT","JULY_CHI","JULY_ENG","JULY_MAT","JHIGH_MA","MAT_FEAR","EDU_EXP","SOC_TYPE","SOC_SAT", "WORK_KID","WORK_FAM","WORK_M","WORK_IND","WORK_DIV")

#在合併時,若變數名稱重複(如CREDIT),R會自動幫我們改為CREDIT.x, CREDIT.y來區分重複變數,但建議大家在命名時就自己區分好
dimnames(mydata_c)[[2]]<- c("ID","DEPT_2009","YEAR_2009","GENDER_2009","CREDIT_1x","CREDIT_2","WORK_1","WORK_2","DISS","TIME","PEOPLE","OWN_TIME","ENG_BOOK","ELS_BOOK")

mydata <- merge(mydata_ab,mydata_c, by="ID")

merge(..,by="ID")根據by來指定欄位進行合併。merge()預設all = FALSE,即只會合併兩個資料框內都有的資料,功能類似於inner_join();如果all = TRUE,則會將兩個資料框中的所有資料都合併,不做篩選,功能類似於full_join()。另外也可以加入all.x = T 或者all.y = T的參數,前者是以第一個資料框中的變數來合併,功能類似於left_join();後者則是以第二個資料框中的變數來合併,類似於right_join()

rbind()cbind()不是利用相同的欄位名稱做對應,而是上下或左右直接接上其他資料。用於合併對齊整齊的資料

head(mydata)#檢視前六筆資料
##   ID DEPT YEAR GENDER KNOW CREDIT WORK HIGH2 HIGH3 FEB_CHI FEB_ENG FEB_MAT
## 1  1 SOCI    2      2    2     25    2     1     1      15      12       9
## 2  2 SOCI    4      1    2     21    1     1     1      13      15       9
## 3  3 SOCI    2      1    1     24    2     1     1      12      14      13
## 4  4 SOCI    2      2    1     25    2     1     1      13      13       8
## 5  5 SOCI    2      2    1     18    2     1     1      14      12      10
## 6  6 SOCI    3      1    1     15    1     1     1      99      99      99
##   JULY_CHI JULY_ENG JULY_MAT JHIGH_MA MAT_FEAR EDU_EXP SOC_TYPE SOC_SAT
## 1       83       46       73        1        2       2        3       2
## 2       60       70       60        1        1       3        2       2
## 3       76       60       71        1        3       5        3       2
## 4       72       68       64        2        2       2        3       2
## 5       74       61       84        1        3       1        3       2
## 6      999      999      999        4        2       2        3       2
##   WORK_KID WORK_FAM WORK_M WORK_IND WORK_DIV DEPT_2009 YEAR_2009 GENDER_2009
## 1        2        4      3        2        3      SOCI         2           2
## 2        1        2      2        1        1      SOCI         4           1
## 3        2        2      5        5        3      SOCI         2           1
## 4        2        2      2        2        4      SOCI         2           2
## 5        5        2      1        1        3      SOCI         2           2
## 6        2        2      3        3        3      SOCI         3           1
##   CREDIT_1x CREDIT_2 WORK_1 WORK_2 DISS TIME PEOPLE OWN_TIME ENG_BOOK ELS_BOOK
## 1        23       23      3      1    2    2      2        3        3        2
## 2        99       18      3      1    2    2      2        2        9        3
## 3        19       20      3      3    2    2      2        4        2        3
## 4        22       23      1      1    1    4      2        2        2        4
## 5        19       19      1      1    1    3      2        2        2        3
## 6        23       21      3      3    3    1      1        2        3        3
names(mydata)#檢視變數名稱
##  [1] "ID"          "DEPT"        "YEAR"        "GENDER"      "KNOW"       
##  [6] "CREDIT"      "WORK"        "HIGH2"       "HIGH3"       "FEB_CHI"    
## [11] "FEB_ENG"     "FEB_MAT"     "JULY_CHI"    "JULY_ENG"    "JULY_MAT"   
## [16] "JHIGH_MA"    "MAT_FEAR"    "EDU_EXP"     "SOC_TYPE"    "SOC_SAT"    
## [21] "WORK_KID"    "WORK_FAM"    "WORK_M"      "WORK_IND"    "WORK_DIV"   
## [26] "DEPT_2009"   "YEAR_2009"   "GENDER_2009" "CREDIT_1x"   "CREDIT_2"   
## [31] "WORK_1"      "WORK_2"      "DISS"        "TIME"        "PEOPLE"     
## [36] "OWN_TIME"    "ENG_BOOK"    "ELS_BOOK"

資料預處理

重編碼

mydata$CREDIT_r <- car::recode(as.numeric(mydata$CREDIT),"99=NA")#2008年問卷第三題
mydata$CREDIT_2_r <- car::recode(as.numeric(mydata$CREDIT_2),"99=NA")#2009年問卷第四題
mydata$DISS_r <- car::recode(as.numeric(mydata$DISS),"9=NA")
mydata$GENDER <- car::recode(as.numeric(mydata$GENDER),"9=NA")

之所以改為car::recode是因為我要指定的是car這個包裡的recode()函數。有些包彼此會有不相容的情況,例如car和dplyr,dplyr包裡的recode()需要指定所有值,因此若沒有.default = x,會導致計畫外的NA出現。

也有其他編碼的函數可以使用,例如na_if()

library(dplyr)
#將值=99設為NA
mydata$CREDIT_r <- na_if(as.numeric(mydata$CREDIT), 99)
mydata$CREDIT_2_r <- na_if(as.numeric(mydata$CREDIT_2), 99)

例如條件式ifelse()

#條件句
mydata$CREDIT_r <- ifelse(mydata$CREDIT == 99, NA, mydata$CREDIT)
mydata$CREDIT_2_r <- ifelse(mydata$CREDIT_2 == 99, NA, mydata$CREDIT_2)

例如rec()

library(dplyr)
library(sjmisc)
mydata$CREDIT_r <- rec(mydata$CREDIT, rec = "99=NA; else = copy")
mydata$CREDIT_2_r <- rec(mydata$CREDIT_2, rec = "99=NA; else = copy")

標籤資料

mydata$GENDER <- factor(mydata$GENDER,
                        levels =c(1,2),
                        labels= c("男", "女"))

mydata$DISS_r <- factor(mydata$DISS, 
                        levels =c(1,2,3,4),
                        labels= c("1 經常", "2 有時", "3 偶爾一兩次", "4 從未"))

table_1

table_1 <- table(mydata$DISS_r)
table_1
## 
##       1 經常       2 有時 3 偶爾一兩次       4 從未 
##            3            6            2            1

table_2

table_2 <- table(mydata$DISS_r, mydata$GENDER)
table_2
##               
##                男 女
##   1 經常        1  2
##   2 有時        3  3
##   3 偶爾一兩次  1  1
##   4 從未        1  0

table_3

table_3 <- prop.table(table(mydata$DISS_r,mydata$GENDER)) #全部加總為100%
table_3
##               
##                        男         女
##   1 經常       0.08333333 0.16666667
##   2 有時       0.25000000 0.25000000
##   3 偶爾一兩次 0.08333333 0.08333333
##   4 從未       0.08333333 0.00000000

小數點位數處理

options(digits = 2) #這樣 R 只顯示 2 位數(整數部分 + 1 位小數)
table_3 <- prop.table(table(mydata$DISS_r,mydata$GENDER))
table_3
##               
##                   男    女
##   1 經常       0.083 0.167
##   2 有時       0.250 0.250
##   3 偶爾一兩次 0.083 0.083
##   4 從未       0.083 0.000

但在這裡無法直接影響 prop.table() 的顯示結果,因此可以使用round()將數字四捨五入到想要的小數點後位數

table_3 <- round(prop.table(table(mydata$DISS_r,mydata$GENDER)),2) #四捨五入至小數點後兩位
table_3
##               
##                  男   女
##   1 經常       0.08 0.17
##   2 有時       0.25 0.25
##   3 偶爾一兩次 0.08 0.08
##   4 從未       0.08 0.00

經常討論的男性同學,佔全體同學的 8%

table_4

table_4 <- prop.table(table(mydata$DISS_r,mydata$GENDER),2)#每個column相加為100%
table_4
##               
##                  男   女
##   1 經常       0.17 0.33
##   2 有時       0.50 0.50
##   3 偶爾一兩次 0.17 0.17
##   4 從未       0.17 0.00

經常討論的男性同學,佔全體男性同學17%

graph1

par(family="Heiti TC Medium")#mac會有中文字體顯示不出來的問題,可以去字體簿,複製postscript名稱

graph1 <- barplot(table_4, 
        main = "圖二、社統作業討論頻率 by 性別", 
        xlab = "性別", 
        col = c("burlywood", "tomato", "darkseagreen", "lightsteelblue"), 
        ylab = "比例", 
        ylim = c(0, 1.0), 
        beside = TRUE,  
        width = 0.5,  # 調整 bar 寬度 (預設 1,可以變小)
        space = c(0.1, 0.5),  # 縮小間距
        legend.text = TRUE,  
        args.legend = list(x = 5.3, y = 1))

補充

color

計算全學年準備修習學分數的平均

mydata$CREDIT_All <- mydata$CREDIT_r + mydata$CREDIT_2_r

is.na(mydata$CREDIT_All)# is.na()確認有無NA存在
##  [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
table(is.na(mydata$CREDIT_All)) 
## 
## FALSE 
##    12
mean(mydata$CREDIT_All)#前面確認過沒有NA,因此我直接mean()
## [1] 40

但如果有NA,那就需要處理NA

# na.omit:遺漏值-刪除
mean(na.omit(mydata$CREDIT_All))
# na.rm:遺漏值-刪除
mean(mydata$CREDIT_All,na.rm = TRUE)

補充:描述統計

平均數

mean(mydata$CREDIT) 
## [1] 20

變異數

var(mydata$CREDIT) 
## [1] 15

標準差

sd(mydata$CREDIT) 
## [1] 3.9

中位數

median(mydata$CREDIT) 
## [1] 20

最大值

max(mydata$CREDIT) 
## [1] 25

最小值

min(mydata$CREDIT) 
## [1] 15

加總

sum(mydata$CREDIT) 
## [1] 245

四分位數

quantile(mydata$CREDIT) 
##   0%  25%  50%  75% 100% 
##   15   18   20   24   25

最小值和最大值

range(mydata$CREDIT) 
## [1] 15 25

每個欄位的「最大值」、「最小值」、「平均值」、「中位數」「第一四分位數」等等資訊

summary(mydata$CREDIT) 
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    15.0    17.8    20.0    20.4    24.2    25.0