lecture
website icon
資料結構
×
website icon 資料管理 統計分析 相關資源 巨人肩膀 語法索引 關於作者

簡介

本部分介紹各種不同的資料結構,使用到的函數包含:

所謂資料結構,指的是 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()