10 多樣的資料結構:向量與因素向量
10.1 R 語言三大資料結構
- 一維
- 向量(vector)
- 因素向量(factor)
- 二維
- 矩陣(matrix)
- 資料框(data.frame)
- 多維
- 陣列(array)
- 清單(list)
10.2 向量
我們可以將四季的名稱放置在一個好像有四個格子的抽屜中:
four_seasons <- c("spring", "summer", "autumn", "winter")
four_seasons
## [1] "spring" "summer" "autumn" "winter"
這就是一個由文字組成的向量(Vector),這是一個我們會很常使用的資料結構,使用 c()
函數將我們想要放入的任意變數集結在一個向量之中:
weekends <- c("Saturday", "Sunday")
my_lucky_numbers <- c(7L, 24L)
weekends
## [1] "Saturday" "Sunday"
my_lucky_numbers
## [1] 7 24
我們提過向量就像是有格子的抽屜,每個格子上面都有一個索引值,方便 R 語言搜尋放在裡頭的變數,舉例說假如我們最喜歡的季節是秋天,可以使用 [3]
這個索引值選出秋天:
four_seasons <- c("spring", "summer", "autumn", "winter")
favorite_season <- four_seasons[3]
favorite_season
## [1] "autumn"
或者我們認為夏天太熱、冬天太冷,不要放在喜歡的季節中,可以使用 [c(-2, -4)]
刪去:
four_seasons <- c("spring", "summer", "autumn", "winter")
favorite_seasons <- four_seasons[c(-2, -4)]
favorite_seasons
## [1] "spring" "autumn"
向量有一個很特別的屬性,那就是只能包含一種變數型別,舉例來說,如果我們將整數跟數值放入同一個向量之中,那麼向量會將整數轉換成數值:
lucky_numbers <- c(7L, 24)
class(lucky_numbers[1])
## [1] "numeric"
如果我們將邏輯值跟整數放入同一個向量之中,那麼向量會將邏輯值轉換成整數:
lucky_numbers <- c(7L, FALSE)
lucky_numbers
## [1] 7 0
class(lucky_numbers[2])
## [1] "integer"
假如是將邏輯值、整數、數值還有文字放入同一個向量之中,那麼向量會全部轉換成文字:
mixed_vars <- c(TRUE, 7L, 24, "spring")
mixed_vars
## [1] "TRUE" "7" "24" "spring"
class(mixed_vars[1])
## [1] "character"
class(mixed_vars[2])
## [1] "character"
class(mixed_vars[3])
## [1] "character"
除了直接使用索引值從向量選出變數,還能夠利用判斷運算子來對向量進行篩選:
four_seasons <- c("spring", "summer", "autumn", "winter")
my_favorite_season <- four_seasons == "autumn"
four_seasons[my_favorite_season]
## [1] "autumn"
如果不只一個條件,我們可以使用 &(AND) 以及 |(OR) 這兩個符號連結判斷條件:
four_seasons <- c("spring", "summer", "autumn", "winter")
my_favorite_seasons <- four_seasons == "spring" | four_seasons == "autumn" # 我喜歡春天或秋天
four_seasons[my_favorite_seasons]
## [1] "spring" "autumn"
在 R 語言中產生向量的方式除了使用 c()
函數手動建立以外,還可以透過 rep()
函數、seq()
函數與 :
快速產生。
rep()
函數可以生成重複變數的向量,times
參數可以指定要生成幾個:
rep(7L, times = 8)
## [1] 7 7 7 7 7 7 7 7
rep("R", times = 10)
## [1] "R" "R" "R" "R" "R" "R" "R" "R" "R" "R"
seq()
函數可以生成等差數列,from
參數指定數列的起始值,to
參數指定數列的終止值,by
參數指定數值的間距:
seq(from = 7, to = 77, by = 7)
## [1] 7 14 21 28 35 42 49 56 63 70 77
seq(from = 1, to = 10, by = 1)
## [1] 1 2 3 4 5 6 7 8 9 10
如果單純是要生成數值間距為 1 的數列,用 :
更快捷:
1:10
## [1] 1 2 3 4 5 6 7 8 9 10
11:20
## [1] 11 12 13 14 15 16 17 18 19 20
10.3 因素向量
R 語言針對儲存文字的向量有一個特殊的資料結構稱為因素向量(factor),它是一個帶有層級(Levels)資訊的向量,我們使用 factor()
函數可以將向量轉換成因素向量:
four_seasons <- c("spring", "summer", "autumn", "winter")
four_seasons
## [1] "spring" "summer" "autumn" "winter"
four_seasons_factor <- factor(four_seasons)
four_seasons_factor
## [1] spring summer autumn winter
## Levels: autumn spring summer winter
眼尖的您有發現輸出因素向量時會將層級的資訊輸出嗎?接下來我們在轉換為因素向量時利用 ordered = TRUE
與 levels =
的參數來排列一下對於四個季節的喜好:
four_seasons <- c("spring", "summer", "autumn", "winter")
four_seasons_factor <- factor(four_seasons, ordered = TRUE, levels = c("summer", "winter", "spring", "autumn"))
four_seasons_factor
## [1] spring summer autumn winter
## Levels: summer < winter < spring < autumn
您有發現這時輸出的因素向量除了層級,還有大小的關係資訊嗎?通常有排序的因素向量適合用在有順序的文字,像是形容溫度的文字:
temperatures <- c("warm", "hot", "cold")
temp_factors <- factor(temperatures, ordered = TRUE, levels = c("cold", "warm", "hot"))
temp_factors
## [1] warm hot cold
## Levels: cold < warm < hot
假如我們只有指定 ordered = TRUE
但沒有指定 levels =
,R 語言會預設使用字母順序排序,可能就會產生不符合直覺的排序,像是:
temperatures <- c("warm", "hot", "cold")
temp_factors <- factor(temperatures, ordered = TRUE)
temp_factors
## [1] warm hot cold
## Levels: cold < hot < warm