關卡 1

這個課程帶大家快速了解R語言的Factor資料結構

關卡 2

Factor是一個向量物件,用途是儲存「類別」的資料,有這樣的資料格式,我們可以輕易把資料集依照類別分組。屬於「類別」資料的例子如:「男、女」,「台北市、台中市、台東市、台南市」

關卡 3

我們觀察一個實際的例子。課程儲存了一個文字向量blood_type,記載著30個人的血型資料。請輸入blood_type。

blood_type

關卡 4

大家可以觀察到這個文字向量有A,B,O,AB四種血型,在資料中重複出現。我們要將他轉為Factor向量,請輸入blood_type_factor<-factor(blood_type)

blood_type_factor <- factor(blood_type)

關卡 5

我們仔細觀察這個Factor向量。請輸入blood_type_factor。

blood_type_factor

關卡 6

可以觀察到R印出Factor向量和文字向量時的方式不太一樣。Factor多出levels這個屬性。

關卡 7

Factor向量中的levels屬性代表向量中允許出現的類別。要取出這些類別,可使用levels函數。請輸入levels(blood_type_factor)來取出所有允許的血型。

levels(blood_type_factor)

關卡 8

在Factor向量中指派沒在levels裡面的類別,會出現NA。請輸入blood_type_factor[5]<-“C”

blood_type_factor[5] <- "C"

關卡 9

輸入blood_type_factor確認第五個元素變成NA。

blood_type_factor

關卡 10

R預設是以字母順序排序levels

關卡 11

進一步觀察factor向量的結構。請輸入str(blood_type_factor)

str(blood_type_factor)

關卡 12

str印出的資訊顯示,Factor向量有四個levels,並列出levels對應的名稱。在levels名稱後是一串整數,Factor實際上是以整數代表對應的levels名稱。例如:一開始3代表第三個level「B」,第二個1代表第一個level「A」。(你可以對照Rstudio右上角Environment中blood_type和blood_type_factor)

關卡 13

所以Factor向量本質上只是整數向量加上levels。這樣設計的原因是儲存整數比儲存文字更省空間。

關卡 14

其實「類別」的資料有兩種。分為「無順序」與「有順序」的,血型的資料是無順序的例子。因為血型並無大小先後之分,你無法說O型比A型大或小。

關卡 15

對於無順序的資料硬要去比大小,R會印出警告訊息。以血型例子,第一個血型是「A」,第二個血型是「AB」。請試著輸入blood_type_factor[1]>blood_type_factor[2]來比較大小。

blood_type_factor[1]> blood_type_factor[2]

關卡 16

對於有順序的資料,我們提供另一個等第制資料集作為範例。請輸入grades載入五個同學的等第資料。

grades

關卡 17

這個資料中有「A」、「B」、「C」三種等第,照一般學校的慣例,A比B好、B比C好、A也比C好。我們可以把等第定出順序。

關卡 18

接著把grades轉為有順序的factor向量。做法是在factor函數中,把ordered設為TRUE。並且把levels順序以向量方式傳入,level要由小到大填入。請輸入grades_factor<-factor(grades,ordered=TRUE,levels=c(“C”,“B”,“A”))

grades_factor <- factor(grades, ordered = TRUE, levels = c("C","B","A"))

關卡 19

輸入grades_factor觀察

grades_factor

關卡 20

可以觀察到levels有順序。

關卡 21

這時比較等第大小有意義。我們可以比較前兩個同學的等第。請輸入grades_factor[1]>grades_factor[2]

grades_factor[1]> grades_factor[2]

關卡 22

我們在這裡做個總結。Factor向量用來儲存類別的資料。level屬性限制能在向量中出現的類別種類。Factor本質上是整數向量,只是帶有levels。Factor可以是無順序或有順序的,可用在Factor函數中使用ordered=TRUE讓Factor變成有序。

關卡 23

最後我們請同學運用這個課程所學到的技巧,做一個簡短的練習。請同學在完成之後存檔,並輸入submit()來檢查結果是否符合預期。如果同學在檔案中看到亂碼,請使用Rstudio左上角的File->ReopenWithEncoding…->選取:UTF-8

#' iris 是一個很有名的資料集。
#' R 在處理iris的Species欄位,也就是鳶尾花資料集時,預設是使用factor型態
species <- iris$Species

#' 請問species共有哪幾種類別?(答案應該是一個character vector)
answer1 <- levels(species)

#' 請問species的類別有無順序關係?
answer2 <- FALSE

#' CO2 是另一個範例數據。
plant <- CO2$Plant

#' 請問plant共有哪幾種類別?(答案應該是一個character vector)
answer3 <- levels(plant)

#' 請問plant的類別有無順序關係?
answer4 <- TRUE