2 R 資料結構

2.1 向量 vector

向量為一維資料的表現和儲存方式,用c()函數可定義向量,如:

a~e為vec向量中的元素(element),各元素在向量中的順序固定,avec向量中的第1個元素,b則為第2個元素,以此類推,若要將vec向量的第4個元素取出,可使用

## [1] "d"

也可同時取出多個元素

## [1] "b" "c"

此外,在同一向量中,所有元素之資料型態必須相同,如上述vec向量,元素均為文字型態,若放不同類別的資料進同一個向量,資料型態會被自動轉成一樣的,範例如下

##  chr [1:3] "TRUE" "a" "1"

和變數指定類似,向量中的元素也可以使用<-重新指定

## [1] "c"
## [1] "a" "b" "z" "d" "e"

2.1.1 快速產生向量函數

若要產生連續向量,如1~20,可使用:來串連首字與最後一字

##  [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20

或是使用seq()函數

##  [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
##  [1]  1  3  5  7  9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49

2.1.2 向量運算

向量也可直接做加減乘除運算,如

##  [1]  4  5  6  7  8  9 10 11 12 13
##  [1]  2  4  6  8 10 12 14 16 18 20

向量和向量也可做運算,如

## [1] 5 7 9
## [1]  4 10 18

2.2 因子 factor

因子是由向量轉換而成,多用於表示類別數據,如大學中有大學生、碩士班學生與博士班學生三種類別的學生,使用方法為factor(資料向量,levels=類別次序)levels參數可設定各類別的次序

## [1] 大學生     碩士班學生 博士班學生
## Levels: 大學生 碩士班學生 博士班學生

因子變量一但決定其類別的種類與數目時,通常不會再作更動,也就是任何新增的元素都要是大學生、碩士班學生與博士班學生其中一種。

2.3 列表 list

由於向量和因子都只能儲存一種元素,使用上彈性較不足,在R語言中,有一彈性很大的資料型態列表list,在列表中,元素可分屬不同資料類別,除了可包括數值文字外,也可以包括資料集,如向量因子等,更進階的使用,還可以包括矩陣與資料框。如要建立列表,可使用list()函數

## $Students
## [1] "Tom"  "Kobe" "Emma" "Amy" 
## 
## $Year
## [1] 2017
## 
## $Score
## [1] 60 50 80 40
## 
## $School
## [1] "CGU"

2.3.1 列表資料擷取

列表可用$符號做資料擷取

## [1] "Tom"  "Kobe" "Emma" "Amy"

也可和向量一樣,使用索引值來擷取資料,和向量不同的是,若要取得,要使用雙中括號[[ ]]

## [1] "Tom"  "Kobe" "Emma" "Amy"

如果只使用單中括號,回傳的資料型態會是列表list,並非列表中的值

## $Students
## [1] "Tom"  "Kobe" "Emma" "Amy"

2.3.2 列表資料編輯設定

列表資料也可和向量資料一樣,重新編輯設定

## [1] "Tom"  "Kobe" "Emma" "Amy"
## [1] "小明" "大雄" "胖虎" "小新" "大白"

除了編輯以外,列表資料也能用$符號與<-變數設定符號新增

若需刪除某變量,可將變量值設定為NULL

## $Students
## [1] "小明" "大雄" "胖虎" "小新" "大白"
## 
## $Year
## [1] 2017
## 
## $School
## [1] "CGU"
## 
## $Gender
## [1] "M" "F" "M" "F" "M"

2.4 矩陣 matrix

##      [,1] [,2]
## [1,]    1    4
## [2,]    2    5
## [3,]    3    6

2.5 資料框 data.frame

資料框是非常常見的二維資料格式,由一系列的欄位(Column)和列(Row)所組成,常見的Excel試算表也是類似的資料表現形式,可使用data.frame()來創建新的資料框

##   StuID name score
## 1     1 小明    80
## 2     2 大雄    60
## 3     3 胖虎    90
## 4     4 小新    70
## 5     5 大白    50

如範例所示,每個欄位都有名稱(StuID, name, score),若沒有設定欄位名稱,R會自動指派 V1 - Vn 作為欄位名稱。在R中,每個欄位的資料型態必須相同,如StuID和score為數值型態,name為文字型態。每一列也有預設的列名,R自動依序指派 1 - n 作為列名。 如需檢查欄位名稱與列名,可使用colnames()rownames()

## [1] "StuID" "name"  "score"
## [1] "1" "2" "3" "4" "5"

如需檢查個欄位之資料型別,可使用str()函數

## 'data.frame':	5 obs. of  3 variables:
##  $ StuID: num  1 2 3 4 5
##  $ name : chr  "小明" "大雄" "胖虎" "小新" ...
##  $ score: num  80 60 90 70 50

資料框可用$符號做欄位資料擷取

##   [1] setosa     setosa     setosa     setosa     setosa     setosa    
##   [7] setosa     setosa     setosa     setosa     setosa     setosa    
##  [13] setosa     setosa     setosa     setosa     setosa     setosa    
##  [19] setosa     setosa     setosa     setosa     setosa     setosa    
##  [25] setosa     setosa     setosa     setosa     setosa     setosa    
##  [31] setosa     setosa     setosa     setosa     setosa     setosa    
##  [37] setosa     setosa     setosa     setosa     setosa     setosa    
##  [43] setosa     setosa     setosa     setosa     setosa     setosa    
##  [49] setosa     setosa     versicolor versicolor versicolor versicolor
##  [55] versicolor versicolor versicolor versicolor versicolor versicolor
##  [61] versicolor versicolor versicolor versicolor versicolor versicolor
##  [67] versicolor versicolor versicolor versicolor versicolor versicolor
##  [73] versicolor versicolor versicolor versicolor versicolor versicolor
##  [79] versicolor versicolor versicolor versicolor versicolor versicolor
##  [85] versicolor versicolor versicolor versicolor versicolor versicolor
##  [91] versicolor versicolor versicolor versicolor versicolor versicolor
##  [97] versicolor versicolor versicolor versicolor virginica  virginica 
## [103] virginica  virginica  virginica  virginica  virginica  virginica 
## [109] virginica  virginica  virginica  virginica  virginica  virginica 
## [115] virginica  virginica  virginica  virginica  virginica  virginica 
## [121] virginica  virginica  virginica  virginica  virginica  virginica 
## [127] virginica  virginica  virginica  virginica  virginica  virginica 
## [133] virginica  virginica  virginica  virginica  virginica  virginica 
## [139] virginica  virginica  virginica  virginica  virginica  virginica 
## [145] virginica  virginica  virginica  virginica  virginica  virginica 
## Levels: setosa versicolor virginica

資料框可用$符號做欄位資料擷取後,當成向量,並使用[ ]做資料編輯。

## [1] setosa     versicolor setosa     setosa     setosa     setosa    
## Levels: setosa versicolor virginica

若需刪除某欄位,可將欄位值設定為NULL

##   Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1          5.1         3.5          1.4         0.2
## 2          4.9         3.0          1.4         0.2
## 3          4.7         3.2          1.3         0.2
## 4          4.6         3.1          1.5         0.2
## 5          5.0         3.6          1.4         0.2
## 6          5.4         3.9          1.7         0.4

2.6 資料表 data.table

data.table是data.frame資料框型別的延伸,如要使用必須安裝data.table (Dowle and Srinivasan 2019) package,使用data.table讀取大型資料的速度比使用資料框快上數倍,進階處理語言也相當好用,在探索式資料分析章節Chapter 7會詳細介紹。其他詳細教學可見 Chapter 7.2 ,DataCamp也提供互動式教學課程,可自行參閱。

2.7 資料屬性查詢函數

資料屬性可透過下列函數查詢:

  • 名稱 names()
  • 各維度名稱 dimnames()
  • 長度 length()
  • 各維度長度 dim()
  • 資料型態 class()
  • 各類資料計數 table()
  • 總覽資料 str()

透過names()函數,可取得各種資料之名稱

##       Africa   Antarctica         Asia    Australia Axel Heiberg       Baffin 
##        11506         5500        16988         2968           16          184
## [1] "Africa"       "Antarctica"   "Asia"         "Australia"    "Axel Heiberg"
## [6] "Baffin"

若為資料框,則會顯示行(欄位)名稱

##            Murder Assault UrbanPop Rape
## Alabama      13.2     236       58   21
## Alaska       10.0     263       48   44
## Arizona       8.1     294       80   31
## Arkansas      8.8     190       50   20
## California    9.0     276       91   41
## Colorado      7.9     204       78   39
## [1] "Murder"   "Assault"  "UrbanPop" "Rape"

透過dimnames()函數可顯示資料框列與行的名稱,先顯示列,再顯示行

## [[1]]
##  [1] "Alabama"        "Alaska"         "Arizona"        "Arkansas"      
##  [5] "California"     "Colorado"       "Connecticut"    "Delaware"      
##  [9] "Florida"        "Georgia"        "Hawaii"         "Idaho"         
## [13] "Illinois"       "Indiana"        "Iowa"           "Kansas"        
## [17] "Kentucky"       "Louisiana"      "Maine"          "Maryland"      
## [21] "Massachusetts"  "Michigan"       "Minnesota"      "Mississippi"   
## [25] "Missouri"       "Montana"        "Nebraska"       "Nevada"        
## [29] "New Hampshire"  "New Jersey"     "New Mexico"     "New York"      
## [33] "North Carolina" "North Dakota"   "Ohio"           "Oklahoma"      
## [37] "Oregon"         "Pennsylvania"   "Rhode Island"   "South Carolina"
## [41] "South Dakota"   "Tennessee"      "Texas"          "Utah"          
## [45] "Vermont"        "Virginia"       "Washington"     "West Virginia" 
## [49] "Wisconsin"      "Wyoming"       
## 
## [[2]]
## [1] "Murder"   "Assault"  "UrbanPop" "Rape"

透過length()函數可顯示資料長度,包括向量與資料框,若資料行態為資料框,則會顯示行(欄位)數

## [1] 48
## [1] 4

透過dim()函數可顯示資料框列與行的長度,與dimnames()相同,先顯示列,後顯示行

## [1] 50  4

使用class()函數可知道變數類別

## [1] "numeric"
## [1] "character"
## [1] "Date"

使用table()函數可知道向量中每個值出現幾次

## NULL
## < table of extent 0 >

使用str()函數可總覽變數資訊

## 'data.frame':	150 obs. of  4 variables:
##  $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
##  $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
##  $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
##  $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
## List of 4
##  $ Students: chr [1:5] "小明" "大雄" "胖虎" "小新" ...
##  $ Year    : num 2017
##  $ School  : chr "CGU"
##  $ Gender  : chr [1:5] "M" "F" "M" "F" ...

References

Dowle, Matt, and Arun Srinivasan. 2019. Data.table: Extension of ‘Data.frame‘. https://CRAN.R-project.org/package=data.table.