社交网络分析的 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()
函数,看看会发生什么。