2 R 資料結構
2.1 向量 vector
向量為一維資料的表現和儲存方式,用c()
函數可定義向量,如:
a~e為vec向量中的元素(element),各元素在向量中的順序固定,a
為vec
向量中的第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()
函數
listSample<-list(Students=c("Tom","Kobe","Emma","Amy"),Year=2017,
Score=c(60,50,80,40),School="CGU")
listSample
## $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()
來創建新的資料框
StuDF <- data.frame(StuID=c(1,2,3,4,5), ##欄位名稱=欄位值
name=c("小明","大雄","胖虎","小新","大白"),
score=c(80,60,90,70,50))
StuDF
## 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.