社交网络分析的 R 基础:(三)向量、矩阵与列表


在第二章介绍了 R 语言中的基本数据类型,本章会将其组装起来,构成特殊的数据结构,即向量、矩阵与列表。这些数据结构在社交网络分析中极其重要,本质上对图的分析,就是对邻接矩阵的分析,而矩阵又是由若干个向量构成,因此需要熟练掌握这些特殊的数据结构。

  • https://cran.r-project.org/web/packages/RcppEigen/vignettes/RcppEigen-Introduction.pdf


列表

列表的创建

列表(list)在 R 语言中是由一个个对象所构成的集合,这些对象可以是不同的数据类型,比如数值、字符串、向量、矩阵等等。如果为列表元素定义名称的话,列表更像是 Python 中的字典,但 R 语言中的列表中的元素是有序的。在 R 语言中使用 list() 函数来创建列表。

list(name = "ruby", age = 18, scores = c(100, 88.5, 82))

上面一行代码创建了一个包含数值、字符串与向量的列表,同时为每一个元素定义了名称。将其输入到 R 终端中,细心的你会发现这与矩阵计算特征值和特征向量的函数 eigen() 返回的类型一致。这种定义了名称的列表对于包含多个返回值的函数非常方便。

> list(name = "ruby", age = 18, scores = c(100, 88.5, 82))
$name
[1] "ruby"

$age
[1] 18

$scores
[1] 100.0  88.5  82.0

列表还可以通过多个列表合并的方式创建,合并使用函数 c()。下面的代码展示了两个列表的合并,同时使用了未定义元素名称的列表创建方式。注意观测列表的输出结果,输出的索引表明了列表是有序的。

> l1 <- list(matrix(c(1:4), nrow = 2))
> l2 <- list(c("a", "b", "c"), 12345)
> c(l1, l2)
[[1]]
     [,1] [,2]
[1,]    1    3
[2,]    2    4

[[2]]
[1] "a" "b" "c"

[[3]]
[1] 12345


?? 提示


c() 本质上并不是创建向量的函数,c 是 combine 的缩写,是一个合并函数。


列表元素的访问

列表中的元素通过“[[索引]]”的形式访问,当列表元素定义了名称后可以使用“$名称”或者“[["名称"]]”的形式访问。

> student <- list(name = "ruby", age = 18, scores = c(100, 88.5, 82))
> student[[1]]
[1] "ruby"
> student$age
[1] 18
> student[["scores"]]
[1] 100.0  88.5  82.0

对于在创建时没有定义名称的列表,仍然可以使用 names() 定义名称。

> l <- list(c("a", "b", "c"), 12345)
> names(l) <- c("name1", "name2")


?? 练习


1. 试着创建一个向量,看看向量能否包含不同类型的元素,比如 c(1, "a") 会创建一个什么向量;


2. 试着对矩阵进行运算,能否求出一个矩阵的最大元素;


3. 列表通过“[索引]”与“[[索引]]”有什么不同,输出看看;


4. list(c("a", "b", "c")) 该列表的长度是多少。


5. 试着对任意一个非空列表使用 unlist() 函数,看看会发生什么。


参考

  1. An Introduction to R
  2. R 数据类型 | 菜鸟教程
  3. R 矩阵 | 菜鸟教程
  4. R 列表 | 菜鸟教程