所謂資料結構,指的是 R 如何儲存數值、字串、邏輯與時間資料。 R 可以將資料儲存為向量、列表、矩陣、陣列、資料集等格式,這幾種格式構成了 R 的資料結構。有時候特定的函數只能處理特定的資料結構,所以要先釐清資料是儲存為哪一種型態。
向量 Vector
向量是 R 最常見的資料儲存型態,可以包含數值、字串以及邏輯值等上述提到的任何資料類型。數值例如1、2、3,字串例如姓名、邏輯例如true、false。
宣告向量的方法非常簡單,只要將資料包含在 c() 函數內即可。
> number<-c(1,2,3) #宣告number數字向量
> phone<-c("Apple","Samsung","Google") #宣告phone字串向量
> logit<-c(FALSE,FALSE,TRUE) #宣告logit邏輯向量
> number
[1] 1 2 3
> phone
[1] "Apple" "Samsung" "Google"
> logit
[1] FALSE FALSE TRUE
因子(factor)是一種特殊的向量物件,當資料屬於類別變數的時候,例如性別,可以用 factor() 函數來儲存類別資料。 factor() 配合 levels 與 labels 參數設定,數值會被儲存成名目資料,並對應到相對的文字標籤上,類似統計軟體的編碼。
> gender<-factor(c(1,1,2,1,2), levels=c(1,2), labels=c("Female","Male"))
> gender
[1] Female Female Male Female Male
Levels: Female Male
列表 List
有別於向量只能存放單一類型的資料,列表允許存放不同類型的資料,提供了一種更為彈性的資料儲存方法。例如可以將手機品牌(字串)、型號(字串)、售價(數值)儲存在同一個列表中。 list() 用來宣告列表。
> phone_1<-list(Brand="Apple", Product="iPhone 17", Price=c(29900)) #宣告第一支手機列表
> phone_2<-list(Brand="Samsung", Product="Galaxy S26", Price=c(36900)) #宣告第二支手機列表
> phone_3<-list(Brand="Google", Product="Pixel 10", Price=c(26490)) #宣告第三支手機列表
> phone_1
$Brand
[1] "Apple"
$Product
[1] "iPhone 17"
$Price
[1] 29900
矩陣 Matrix
矩陣是二維的資料結構,但不像列表可以存放不同類型的資料,矩陣只能儲存相同的資料類型,可以是數字、字串或其他類別,但數字資料就不能夾雜字串,反之亦然。
例如上述手機的例子,可以用一個 matrix() 矩陣函數存放三支手機的品牌與型號,但就不能儲存售價。
> mobile<-c("Apple","Samsung","Google","iPhone 17","Galaxy S26","Pixel 10") #宣告mobile向量
> mobile<-matrix(mobile,nrow=3,ncol=2,byrow=FALSE,dimnames=list(c("","",""),c("Brand","Product"))) #建立mobile矩陣
> mobile
Brand Product
"Apple" "iPhone 17"
"Samsung" "Galaxy S26"
"Google" "Pixel 10"
一維向量或列表,可以轉換成一個二維矩陣。以下是數字矩陣的例子:
> vector_data<-c(1, 2, 3, 4, 5, 6)
> matrix_1<-matrix(vector_data, nrow=2, ncol=3, byrow=T, dimnames=list(c("",""),c("","","")))
> matrix_1
1 2 3
4 5 6
> list_data<-list(7, 8, 9, 10, 11, 12)
> matrix_2<-matrix(list_data, nrow=2, ncol=3, byrow=T, dimnames=list(c("",""),c("","","")))
> matrix_2
7 8 9
10 11 12
要注意的是,用列表創造出來的資料並不是數值,所以進行矩陣運算會出現錯誤訊息。
> matrix_1+matrix_2
錯誤發生在 matrix_1 + matrix_2: 二元運算子中有非數值引
陣列 Array
陣列可以看成是矩陣的延伸。矩陣是二維的資料結構,陣列則是三維以上的資料結構。可以把陣列想像成一個魔術方塊,魔術方塊是由3層3×3的小方塊堆疊而成,每一層3×3的小方塊就是像是一個二維矩陣,共有3層矩陣組合而成一個完整的3×3×3魔術方塊。 array() 函數配合dim參數用來宣告陣列資料。
> layer_1<-c(1:9) #第一層資料
> layer_2<-c(10:18) #第二層資料
> layer_3<-c(19:27) #第三層資料
> cube<-array(c(layer_1, layer_2, layer_3), dim=c(3,3,3)) #建立3×3×3陣列
> cube
, , 1
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
, , 2
[,1] [,2] [,3]
[1,] 10 13 16
[2,] 11 14 17
[3,] 12 15 18
, , 3
[,1] [,2] [,3]
[1,] 19 22 25
[2,] 20 23 26
[3,] 21 24 27
資料集 Data Frame
資料集能存放不同類型的資料,對於資料類型有最大的容許度,就像是在SPSS、EXCEL儲存格看到的一樣,因此資料集無疑是統計分析最常見的資料結構。
以市售汽車為例,除了品牌(字串)、車型(字串)之外,還可以包含馬力(數字)、是不是進口車(邏輯)等資料。資料集的建立可以透過宣告個別向量,再用 data.frame() 函數將資料串連起來。
> brand<-c("ford","nissan","mazda","toyota","honda") #宣告brand品牌向量
> model<-c("focus","sentra","cx5","rav4","hrv") #宣告model車型向量
> power<-c(182,138,165,173,143) #宣告power馬力向量
> import<-c("FALSE","FALSE","TRUE","TRUE","FALSE") #宣告import是否屬於進口車向量
> car<-data.frame(brand,model,power,import) #建立包含所有向量的car資料集
> names(car)<-c("Brand","Model","Power","Import") #命名car資料集的變數名稱
> car
Brand Model Power Import
1 ford focus 182 FALSE
2 nissan sentra 138 FALSE
3 mazda cx5 165 TRUE
4 toyota rav4 173 TRUE
5 honda hrv 143 FALSE
資料結構的轉換
不同資料結構可以透過 R 內建的函數進行轉換,下表呈現不同資料結構的轉換:
| From / To | 向量 Vector | 列表 List | 矩陣 Matrix | 陣列 Array | 資料集 Data Frame |
|---|---|---|---|---|---|
| 向量 Vector | c() | as.list() | matrix() | data.frame() | |
| 列表 List | unlist() | as.matrix() | |||
| 矩陣 Matrix | as.vector()、c() | as.list() | as.data.frame() | ||
| 資料集 data frame | as.list() | as.matrix() |