1.data.frame

data.frame是R语言用来处理表格式数据的数据结构。
我们可以运用data.frame()函数手动创造数据框,让我们建立一个很简单的数据框叫做great_nba_teams,这个数据框有队名、胜场数、败场数、是否获得总冠军与球季。

team_name <- c("Chicago Bulls", "Golden State Warriors")
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

我们使用观测值(observations)来称呼数据框中水平方向的数据,使用变数(variables)来称呼数据框中垂直方向的数据;数据框能够以[m,n]两个索引值来搭配选择。

great_nba_teams[1, 1] # 选出第一行第一列的数 "Chicago Bulls"
great_nba_teams[1, ] # 选出第一行的数
great_nba_teams[, 1] # 选出第一列的数

数据框预设会将文字向量改以factor向量储存,如果您希望修正为文字向量可以有两种作法。

# 一种是建立的时候在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])

数据框支持使用变数名称来选择,我们可以用$变数名称或者[,“变数名称”]这两种写法。

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

我们也可以透过逻辑值向量来对数据框进行筛选,选出最终有获得总冠军的队伍。

won_champion = great_nba_teams$is_champion
great_nba_teams[won_champion, ]
2. matrix

矩阵与数据框相同是能够储存行(Row)与列(Column)的数据结构

# 建立一个新的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"

matrix()函数还有一个byrow的参数可以指定要用什么顺序摆放原先在向量中的元素,虽然这个矩阵的外观仍然是2x3,但六个数字摆放的方向变为水平的。byrow参数的预设值为FALSE,意思是如果我们没有特别指定,就是以垂直的方向来摆放矩阵。

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

可以用[]索引选取,也可以用逻辑值来筛选

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

矩阵由向量所建构而成,除了多一个维度之外,其余特性都很相似,例如我们将数值向量与逻辑值向量合并放入矩阵,则逻辑值向量亦会被自动转换成数值向量(True是1,False是0),进而就成为一个数值矩阵。

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
3.array

数组(array)是矩阵的多维度版本,除了原有的水平方向数据(Row)与垂直方向数据(Column)我们可以再多指定n个维度,简单来说,就是在一个数组的物件之中,可以允许储存多个矩阵。

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

因为现在有了三个维度,所以在使用索引值选择时,就需要增加第三个维度的索引值。

my_arr[1, 2, 2] # 选出第二个矩阵,第一行第二列的数
my_arr[1, , 2] # 选出第二个矩阵,第一行的数