2 R 資料結構

2.1 向量 vector

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

vec<-c('a','b','c','d','e')

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

vec[4] ## 第4個元素
## [1] "d"

也可同時取出多個元素

vec[c(2,3)] ## 第2與第3個元素
## [1] "b" "c"

此外,在同一向量中,所有元素之資料型態必須相同,如上述vec向量,元素均為文字型態。

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

vec[3]
## [1] "c"
vec[3]<-'z' ##第三個元素值設定為“z”
vec
## [1] "a" "b" "z" "d" "e"

2.1.1 快速產生向量函數

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

1:20 ## c(1,2,...,19,20)
##  [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20

或是使用seq()函數

seq(from=1,to=20,by=1) ##1~20,中間相隔1
##  [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
seq(from=1,to=50,by=2) ##1~50,中間相隔2
##  [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 向量運算

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

numvec<-1:10 ## c(1,2,3,4,5,6,7,8,9,10)
numvec+3 ## 所有元素+3
##  [1]  4  5  6  7  8  9 10 11 12 13
numvec*2 ## 所有元素*2
##  [1]  2  4  6  8 10 12 14 16 18 20

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

numvec1<-1:3 ## c(1,2,3)
numvec2<-4:6 ## c(4,5,6)
numvec1+numvec2
## [1] 5 7 9
numvec1*numvec2
## [1]  4 10 18

2.2 因子 factor

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

factor(c("大學生","碩士班學生","博士班學生"),
       levels = c("大學生","碩士班學生","博士班學生"))
## [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 列表資料擷取

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

listSample$Students ##取得中表中的Students變量
## [1] "Tom"  "Kobe" "Emma" "Amy"

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

listSample[[1]] ##取得中表中第一個變量的值
## [1] "Tom"  "Kobe" "Emma" "Amy"

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

listSample[1] ##取得中表中第一個變量(列表型態)
## $Students
## [1] "Tom"  "Kobe" "Emma" "Amy"

2.3.2 列表資料編輯設定

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

listSample[[1]] 
## [1] "Tom"  "Kobe" "Emma" "Amy"
listSample[[1]]<-c("小明","大雄","胖虎","小新","大白") ##將Students變量重新設定
listSample[[1]] 
## [1] "小明" "大雄" "胖虎" "小新" "大白"

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

listSample$Gender<-c("M","F","M","F","M") ##新增Gender變量,並設定向量值

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

listSample$Score<-NULL ##刪除Score變量
listSample
## $Students
## [1] "小明" "大雄" "胖虎" "小新" "大白"
## 
## $Year
## [1] 2017
## 
## $School
## [1] "CGU"
## 
## $Gender
## [1] "M" "F" "M" "F" "M"

2.4 矩陣 matrix

a <- matrix(c(1:6), nrow=3, ncol=2) ##建立3x2的矩陣,分別填入1~6的值
a
##      [,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()

colnames(StuDF) ##欄位名稱
## [1] "StuID" "name"  "score"
rownames(StuDF) ##列名
## [1] "1" "2" "3" "4" "5"

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

str(StuDF) 
## 'data.frame':    5 obs. of  3 variables:
##  $ StuID: num  1 2 3 4 5
##  $ name : Factor w/ 5 levels "大白","大雄",..: 4 2 5 3 1
##  $ score: num  80 60 90 70 50

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

iris$Species ##取得iris資料框中的Species欄位
##   [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

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

iris$Species[2]<-"versicolor"
head(iris$Species)
## [1] setosa     versicolor setosa     setosa     setosa     setosa    
## Levels: setosa versicolor virginica

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

iris$Species<-NULL ##刪除Species欄位
head(iris)
##   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 2016) package,使用data.table讀取大型資料的速度比使用資料框快上數倍,進階處理語言也相當好用,在探索式資料分析章節Chapter 7會詳細介紹。其他詳細教學可見 Chapter 7.2 ,DataCamp也提供互動式教學課程,可自行參閱。

2.7 資料屬性查詢函數

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

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

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

head(islands) ##R內建的資料
##       Africa   Antarctica         Asia    Australia Axel Heiberg       Baffin 
##        11506         5500        16988         2968           16          184
head(names(islands)) ##顯示上述資料之資料名稱
## [1] "Africa"       "Antarctica"   "Asia"         "Australia"    "Axel Heiberg"
## [6] "Baffin"

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

head(USArrests) ##R內建的資料
##            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
head(names(USArrests)) ##顯示上述資料之資料名稱
## [1] "Murder"   "Assault"  "UrbanPop" "Rape"

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

dimnames(USArrests) 
## [[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()函數可顯示資料長度,包括向量與資料框,若資料行態為資料框,則會顯示行(欄位)數

length(islands) 
## [1] 48
length(USArrests) 
## [1] 4

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

dim(USArrests) 
## [1] 50  4

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

class(1)
## [1] "numeric"
class("Test")
## [1] "character"
class(Sys.Date())
## [1] "Date"

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

iris$Species ##原始值
## NULL
table(iris$Species) ##統計結果
## < table of extent 0 >

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

str(iris)
## '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 ...
str(listSample)
## 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. 2016. Data.table: Extension of ‘Data.frame‘. https://CRAN.R-project.org/package=data.table.