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] # 选出第二个矩阵,第一行的数