關卡 1

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

關卡 2

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

關卡 3

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

blood_type

關卡 4

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

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 -> Reopen With Encoding… -> 選取: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