iT邦幫忙

2022 iThome 鐵人賽

DAY 6
0

今天要介紹的資料型態分別是 list、matrix 和 data frame。這三種資料型態主要的功能就是將資料排列成結構狀。首先就從 list 開始吧!

list

大家是否還記得昨天提到 vector 這種資料型態,每一個 element 都要是相同型態的規定呢?是不是覺得這樣的規定在處理不同資料型態的值,卻又需要將這些資料整合在同一個變數裡時非常不方便、綁手綁腳?那這時候該怎麼辦呢?其實在 R 裡面,列表(list)就能完美解決這個問題喔!舉例來說,一個人身上不會只有一項可辨識的特徵,一定是有許許多多的資訊所組合而成,包括年齡、性別、學歷、嗜好、工作等等......但其中年齡是數值,性別、學歷、嗜好和工作可能是類別變數,這樣便無法儲存於同一個 vector。因此,若我們想要儲存一個人的所有資訊,就可以用 list 的資料型態,即 list() 這個函式


Jack <- list(gender = "man", age= 28, hobby = c("playing the guitar", "reading novels"))
Jack        # list 輸出時是什麼樣子呢?

執行結果為:
$gender
[1] "man"

$age
[1] 28

$hobby
[1] "playing the guitar" "reading novels"

我們再來檢查一下內部的資料型態


str(Jack)

執行結果為:
List of 3
$ gender: chr "man"
$ age : num 28
$ hobby : chr [1:2] "playing the guitar" "reading novels"

這邊可以看到輸出結果一開始就告訴你這個 list 是由 3 個 elements 所組成,包含 gender、age 和 hobby,其中 gender 和 hobby 是 character,age 是 number。這樣是不是很清楚明瞭呢?

那麼,既然可以儲存資料,也要可以把資料取出來才對!不知道大家有沒有發現,每一項 element 前面都有 $ 這個符號呢? 沒錯!它就是用來取資料的!也就是說如果我們想要取出 Jack 這個人的 hobby 是什麼,只要這樣寫就可以了


Jack$hobby

執行結果為:
[1] "playing the guitar" "reading novels"

當然,也可以使用和 vector 一樣的方式,利用 index 來找出資料


Jack[[3]]

執行結果為:
[1] "playing the guitar" "reading novels"

大家有沒有有注意到,上面的 code 是使用兩個中括號呢?為什麼是 2 個? 1 個不行嗎?那我們就來看一下用一個會是什麼結果吧!


Jack[3]

執行結果為:
$hobby
[1] "playing the guitar" "reading novels"

眼尖的各位想必已經注意到不同了吧?我們繼續使用 str() 檢視一下資料型態。


str(Jack[[3]])
str(Jack[3])

執行結果為:
chr [1:2] "playing the guitar" "reading novels"

List of 1
$ hobby: chr [1:2] "playing the guitar" "reading novels"

使用兩個括號取出的資料型態是 vector,而一個括號則是 list 喔~

matrix & data frame

將 matrix 和 data frame 放在一起講與 number 和 integer 的情況類似,這兩個是很相似的資料型態。在 R 裡面,用 matrix() 就能創造一個 matrix,而 matrix 基本的結構是 matrix(data, nrow, ncol, byrow, dimnames)。


row_matrix <- matrix(c(101:112), nrow = 4, byrow = TRUE); row_matrix

col_matrix <- matrix(c(101:112), nrow = 4, byrow = FALSE); col_matrix

執行結果為:

 [,1] [,2] [,3]

[1,] 101 102 103
[2,] 104 105 106
[3,] 107 108 109
[4,] 110 111 112

 [,1] [,2] [,3]

[1,] 101 105 109
[2,] 102 106 110
[3,] 103 107 111
[4,] 104 108 112

有沒有發現不同呢?其中 c(101:112) 代表的是建立一個 101~112 之間的矩陣,這個矩陣要有 4 列(nrow = 4),byrow = TRUE 則是指以 row 來合併,所以 row_matrix 才會以 101、102、103 這樣由左至右,一列結束換下一列的方式呈現 matrix。而 col_matrix 則是因為 byrow = FALSE,所以代表是以 column(欄)的方式排列,101、102、103 是由上至下,一欄排完換下一欄。

不過這樣直接呈現的 matrix 會沒有列和欄的名稱,所以可以給 matrix 裡 dinames 這個設定賦值,給定名稱。


rownames = c("Jack", "Kevin", "Paul", "David")
colnames = c("Age", "ID", "Height")

(name_matrix <- matrix(c(101:112), nrow = 4, byrow = TRUE, dimnames = list(rownames, colnames)))

執行結果為:
Age ID Height
Jack 101 102 103
Kevin 104 105 106
Paul 107 108 109
David 110 111 112

matrix 和 vector、list 的概念一樣,都有 index,所以要提取特定位置的資料使用 index 就可以了!以上面 name_matrix 的例子來寫 code,中括號裡面前面這個值是列,後面是欄。


name_matrix[3,2] # 取 108 這個數值
name_matrix[2,]  # 取第二列
name_matrix[]    # 取第三欄
dim(name_matrix) # 4*3的矩陣
rownames(name_matrix) # 取所有的列名
colnames(name_matrix) # 取所有的欄名

執行結果為:
[1] 108

Age ID Height
104 105 106

Jack Kevin Paul David
103 106 109 112

[1] 4 3

[1] "Jack" "Kevin" "Paul" "David"

[1] "Age" "ID" "Height"

data frame

最後,我們來談談 data frame 吧!在 R 裡面,data frame 比 matrix 更為常用。data frame 就像是 Excel 裡面的 sheet,因此,若匯入一個 .csv 檔案進去 R 的話,資料型態就會變為 data frame。當然,也可以自己建立一個簡單的 data frame。


ID <- c(1, 2, 3) 
fruit <- c("apple", "banana", "mango") # characters
logic <- c(TRUE, FALSE, TRUE)  # logical values

df = data.frame(ID, fruit, logic); df # ;df 代表直接印出 df

在 R 中,有很多內置 data 的 packages。例如 iris 這個 dataset。


library(datasets) # load the package

iris

str(iris)

執行結果為:
iris

'data.frame': 150 obs. of 5 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 ...
$ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1

可以看到這個數據集包含 number 和 factor,我們可以用以下 code 來抓取 Species 的 Levels


levels(iris[,'Species']) # 看 Species 的 Levels 分別為哪些,因為要看的是 Species 這一欄的資料,故 Species 放中括號的右邊

levels(iris$Species) # 看 Species 的 Levels 分別為哪些

iris[2, 'Species'] # 看第二列,Species 這一欄是什麼

iris$Species[2] # 看 Species 這一欄第二個項目是什麼(其實等於看第二列,Species 這一欄是什麼)

執行結果為:
[1] "setosa" "versicolor" "virginica"

[1] "setosa" "versicolor" "virginica"

[1] setosa
Levels: setosa versicolor virginica

[1] setosa
Levels: setosa versicolor virginica

最後,教一下大家如何匯入 .csv 檔,在 R 裡面編輯吧!我們可以利用 read.csv() 來完成


data = read.csv(".csv 檔案的位址") # Mac 可以點一下要匯入的檔案,按住 option、command 和 C 就可以複製此檔案的位址,貼到 “” 裡了

資料型態介紹完畢~明天見囉!


上一篇
Day 5 資料型態介紹 前篇
下一篇
Day 7 把文字裝成一袋?Bag of Word (BoW) & TF-IDF 在 NLP 中的應用
系列文
語言學與NLP30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言