#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(mydata$DISS_r)
table_1
##
## 1 經常 2 有時 3 偶爾一兩次 4 從未
## 3 6 2 1
table_2 <- table(mydata$DISS_r, mydata$GENDER)
table_2
##
## 男 女
## 1 經常 1 2
## 2 有時 3 3
## 3 偶爾一兩次 1 1
## 4 從未 1 0
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 <- 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%
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))
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