05

数据结构

矩阵、列表、数据框

基础篇

前面介绍了向量,它是R语言中最基础的数据结构

图片

我们还会遇到其它数据结构

  • 矩阵
  • 列表
  • 数据框

这些数据结构都可以看作由向量衍生出来的^[数据结构还包括array,但因为它的使用频次不及向量、矩阵、列表和数据框多,所以暂时不介绍。]。

矩阵

矩阵可以存储行(row)和列(column)二维的数据。

图片

它实际上是向量的另一种表现形式,也就说它的本质还是向量,一维的向量用二维的方式呈现。

矩阵可以用 matrix() 函数创建,第一个位置的参数是用于创建矩阵的向量。比如下面把向量c(2, 4, 3, 1, 5, 7) 转换成2行3列的矩阵

R
m <- matrix(
  c(2, 4, 3, 1, 5, 7),
  nrow = 2, 
  ncol = 3
)

m
图片

大家还记得我们的向量是一个竖着的糖葫芦, 那么在转换成矩阵的时候,也是先竖着排,第一列竖着的方法排满后,就排第二列,这是默认的情形。如果想改变这一传统习惯,也可以增加一个语句 byrow = TRUE,这条语句让向量先横着排,排完第一行,再排第二行。

R
matrix(
  c(2, 4, 3, 1, 5, 7),
  nrow = 2, 
  ncol = 3,
  byrow = TRUE
)

矩阵的属性

  • 类型
R
class(m)
  • 长度
R
length(m)
  • 维度
R
dim(m)

列表

如果我们想要装更多的东西,可以想象有一个小火车^[列表与向量一样,也是竖着的,但为了方便大家理解,我这里把它横过来看,就像一个小火车],小火车的每节车厢是独立的,因此每节车厢装的东西可以不一样。这种结构装载数据的能力很强大,称之为列表(list)。我们可以使用list()函数创建列表

图片
R
list1 <- list(
  a = c(5, 10),
  b = c("I", "love", "R", "language", "!"),
  c = c(TRUE, TRUE, FALSE, TRUE)
)
list1
图片

c() 函数创建向量 对比 list() 函数创建列表

图片

列表的属性

  • 类型
R
class(list1)
  • 长度
R
length(list1)

数据框

前面说过,列表可以想象成一个小火车,如果每节车厢装的都是向量而且等长,那么这种特殊形式的列表就变成了数据框 (data frame)

图片

换句话说,数据框是一种特殊的列表,我们可以使用 data.frame() 函数构建数据框

R
df <- data.frame(
  name      = c("Alice", "Bob", "Carl", "Dave"),
  age       = c(23, 34, 23, 25),
  marriage  = c(TRUE, FALSE, TRUE, FALSE),
  color     = c("red", "blue", "orange", "purple")
)
df
图片

数据框类似于我们经常用的excel表格。由于数据框融合了向量、列表和矩阵的特性,所以在数据科学的统计建模和可视化中运用非常广泛。

数据框的属性

  • 类型
R
class(df)
  • 维度
R
nrow(df)
ncol(df)

数据框 vs 矩阵

数据框(data frame) 和 矩阵(matrix) 都用来表示二维数据, 即长方形的, 按"行"和"列"排列的数据。

数据框和矩阵两者主要区别在于,矩阵中的元素必须是相同的数据类型,而数据框则可以由多种类型的数据构成。

小结

R 对象的数据结构(向量、矩阵、列表和数据框),总结如下

  • 向量: 糖葫芦
  • 矩阵: 糖葫芦,有多行多列
  • 列表: 小火车
  • 数据框: excel表格
图片

为了更好地理解相关概念,建议大家阅读Garrett Grolemund的 hopr这本书 [@Garrett2014]。

习题

  • 为什么说数据框融合了向量、矩阵和列表的特性?
  • 创建一个学生信息的data.frame,包含姓名、性别、年龄,成绩等变量。