R 基礎知識:數據結構(data.frame & matrix & array)

1.data.frame

data.frame是R語言用來處理表格式數據的數據結構。我們可以運用data.frame()函數手動創造數據框,讓我們建立一個很簡單的數據框叫做greatnbateams,這個數據框有隊名、勝場數、敗場數、是否獲得總冠軍與球季。

<code>team_name wins = c(72, 73)
losses = c(10, 9)
is_champion = c(TRUE, FALSE)
season = c("1995-96", "2015-16")
great_nba_teams = data.frame(team_name, wins, losses, is_champion, season)

# 可以用View()來瀏覽表格
View(great_nba_teams)
# 用str()來查看數據框的向量類型
str(great_nba_teams)
# 'data.frame': 2 obs. of 5 variables:
# $ team_name : Factor w/ 2 levels "Chicago Bulls",..: 1 2
# $ wins : num 72 73
# $ losses : num 10 9
# $ is_champion: logi TRUE FALSE
# $ season : Factor w/ 2 levels "1995-96","2015-16": 1 2/<code>

我們使用觀測值(observations)來稱呼數據框中水平方向的數據,使用變數(variables)來稱呼數據框中垂直方向的數據;數據框能夠以[m,n]兩個索引值來搭配選擇。

<code>great_nba_teams[1, 1] # 選出第一行第一列的數 "Chicago Bulls"
great_nba_teams[1, ] # 選出第一行的數
great_nba_teams[, 1] # 選出第一列的數/<code>

數據框預設會將文字向量改以factor向量儲存,如果您希望修正為文字向量可以有兩種作法。

<code># 一種是建立的時候在data.frame()函數中指定參數stringsAsFactors = FALSE。
great_nba_teams = data.frame(team_name, wins, losses, is_champion, season, stringsAsFactors = FALSE)
# 另一種是事後使用 as.character() 函數進行向量類型的轉換。
great_nba_teams = data.frame(team_name, wins, losses, is_champion, season)
great_nba_teams[, 1] = as.character(great_nba_teams[, 1])
great_nba_teams[, 5] = as.character(great_nba_teams[, 5])/<code>

數據框支持使用變數名稱來選擇,我們可以用$變數名稱或者[,“變數名稱”]這兩種寫法。

<code>great_nba_teams$team_name
great_nba_teams[, "season"]
# [1] Chicago Bulls Golden State Warriors
# Levels: Chicago Bulls Golden State Warriors
# [1] 1995-96 2015-16
# Levels: 1995-96 2015-16/<code>

我們也可以透過邏輯值向量來對數據框進行篩選,選出最終有獲得總冠軍的隊伍。

<code>won_champion = great_nba_teams$is_champion
great_nba_teams[won_champion, ]/<code>


2. matrix

矩陣與數據框相同是能夠儲存行(Row)與列(Column)的數據結構

<code># 建立一個新的matrix
my_mat = matrix(1:6, nrow = 2)
my_mat
class(my_mat)
# [,1] [,2] [,3]
# [1,] 1 3 5
# [2,] 2 4 6
# [1] "matrix"/<code>

matrix()函數還有一個byrow的參數可以指定要用什麼順序擺放原先在向量中的元素,雖然這個矩陣的外觀仍然是2x3,但六個數字擺放的方向變為水平的。byrow參數的預設值為FALSE,意思是如果我們沒有特別指定,就是以垂直的方向來擺放矩陣。

<code>my_mat = matrix(1:6, nrow = 2, byrow = TRUE)
my_mat
# [,1] [,2] [,3]
# [1,] 1 2 3
# [2,] 4 5 6/<code>

可以用[]索引選取,也可以用邏輯值來篩選

<code>my_mat = matrix(1:6, nrow = 2)
my_mat[2, 3]
# [1] 6

my_mat < 6 & my_mat > 1
my_mat[my_mat < 6 & my_mat > 1]
# [,1] [,2] [,3]
# [1,] FALSE TRUE TRUE
# [2,] TRUE TRUE FALSE
# [1] 2 3 4 5/<code>

矩陣由向量所建構而成,除了多一個維度之外,其餘特性都很相似,例如我們將數值向量與邏輯值向量合併放入矩陣,則邏輯值向量亦會被自動轉換成數值向量(True是1,False是0),進而就成為一個數值矩陣。

<code>my_mat = matrix(c(1, 2, TRUE, FALSE, 3, 4), nrow = 2)
my_mat
# [,1] [,2] [,3]
# [1,] 1 1 3
# [2,] 2 0 4/<code>


3.array

數組(array)是矩陣的多維度版本,除了原有的水平方向數據(Row)與垂直方向數據(Column)我們可以再多指定n個維度,簡單來說,就是在一個數組的物件之中,可以允許儲存多個矩陣。

<code>my_arr = array(1:20, dim = c(2, 2, 5))
class(my_arr)
my_arr
# [1] "array"
# , , 1
#
# [,1] [,2]
# [1,] 1 3
# [2,] 2 4
#
# , , 2
#
# [,1] [,2]
# [1,] 5 7
# [2,] 6 8
#
# , , 3
#
# [,1] [,2]
# [1,] 9 11
# [2,] 10 12
#
# , , 4
#
# [,1] [,2]
# [1,] 13 15
# [2,] 14 16
#
# , , 5
#
# [,1] [,2]
# [1,] 17 19
# [2,] 18 20/<code>

因為現在有了三個維度,所以在使用索引值選擇時,就需要增加第三個維度的索引值。

<code>my_arr[1, 2, 2] # 選出第二個矩陣,第一行第二列的數
my_arr[1, , 2] # 選出第二個矩陣,第一行的數/<code>

【數據小鹽罐兒】一個“鹹”的無聊的數據分析公眾號,

不定期分享一些有趣好玩的項目以及大量的學習資源。


分享到:


相關文章: