R 中的矩阵、列表和数组
介绍
在本指南中,我们将学习 R 中三种最常见的数据结构。这些数据结构在您学习数学时应该很熟悉,它们也存在于每种编程语言中,在实现方面差别很小。这些数据结构是矩阵(二维向量)、列表(一维向量或可以保存不同类型的项目的特殊对象)和数组(具有一个或多个维度的向量)。首先,我们将介绍每个数据容器的基本概念,然后我们将研究它们的实际用例。在每个数据结构的核心都隐藏着原子向量数据类型。
矩阵
矩阵只不过是二维矩形布局中排列的数据元素的集合。3x3 维矩阵的示例如下所示。
开始使用矩阵时,你需要记住的最重要的事情是matrix()函数。此函数具有以下框架。
matrix(
c(),
nrow=,
ncol=,
byrow = )
第一个参数是一个向量,它定义矩阵中存在哪些原子值。第二个参数定义向量拆分成多少行,第三个参数指定多少列。向量中元素的数量应该是nrow * ncol的倍数或分数。最后一个参数定义是否要按行或列填充矩阵。默认情况下,byrow的参数为FALSE,这意味着矩阵从一列到另一列填充。
让我们尝试一下。您的矩阵定义如下所示。
matrix(
c(1,2,3,4,5,6,7,8),
nrow = 4,
ncol = 2,
byrow = TRUE)
输出应如下所示。
如果省略byrow=TRUE参数,则会出现以下输出。
其余元素去哪儿了?问题是你的向量大于矩阵大小。如果你想从向量中获取所有值,ncol =4应该是你所做的修改。这样你就得到了以下输出。
现在您已经有了基础,接下来该如何进行呢?
转置
这个概念来自线性代数。基本上,矩阵的对角线被翻转。为了在 R 中执行此操作,您可以使用t()函数。让我们看看它是什么样子的,给定下面的矩阵。
a <- matrix(
c(1,2,3,4,5,6,7,8),
nrow = 4,
ncol = 2,
byrow = TRUE)
转调之前,输出如下所示。
转置之后,输出如下所示。
合并矩阵
为了合并两个矩阵,需要使用cbind()函数。它以两个矩阵作为参数并生成它们的组合。合并矩阵时,需要确保它们具有相同的行数,否则会引发异常。
给定两个矩阵B和D。
B <- matrix(
c(2, 4, 3, 1, 5, 7),
nrow=3,
ncol=2)
D <- matrix(
c(1, 3, 2),
nrow=3,
ncol=1)
它们的组合可以通过以下方式创建。
cbind(B,D)
输出如下所示。
解构
这个概念允许你将矩阵分解为其原始向量,这在某些情况下非常有用。以下面的矩阵H为例。
H <- matrix(
c(1,2,3,4,5,6,7,8,9,10),
nrow=5,
ncol=2)
您可以使用c()函数对其进行解构。
c(H)
输出如下所示。
1] 1 2 3 4 5 6 7 8 9 10
列表
列表是可能包含不同类型的元素的对象,类似于向量。这些不同类型的元素可以是字符串、数字、向量,甚至可以是另一个列表。您可以将矩阵作为列表中的不同元素。这个概念是特殊用例的通用容器。允许您创建列表的函数称为list()。
示例列表如下所示。
data <- list("Server","Network Device",c(1,2,3,4), FALSE, list(1,2,3,4,5,6))
您的列表内容现在如下。
[1]]
[1] "Server"
[[2]]
[1] "Network Device"
[[3]]
[1] 1 2 3 4
[[4]]
[1] FALSE
[[5]]
[[5]][[1]]
[1] 1
[[5]][[2]]
[1] 2
[[5]][[3]]
[1] 3
[[5]][[4]]
[1] 4
[[5]][[5]]
[1] 5
[[5]][[6]]
[1] 6
您可以看到,对于列表中可以存储的元素数量或类型,实际上没有任何限制。有一个称为names()的特殊函数,它允许您命名列表,从而产生一个特殊的类似字典的数据结构。字典数据结构由键值对组成。在这种情况下,键是名称列表,值是实际元素。
让我们给列表元素命名。
names(data) <- c("Hardware", "Network", "vector", "boolean","nestedlist")
函数执行后,我们可以通过名称来引用列表中的元素。
data$Hardware
[1] "Server"
data$Network
[1] "Network Device"
data$nestedlist
[[1]]
[1] 1
[[2]]
[1] 2
[[3]]
[1] 3
[[4]]
[1] 4
[[5]]
[1] 5
[[6]]
[1] 6
这允许您构建更复杂的函数并创建抽象,使用户能够更有效地理解和维护代码。与其他编程语言中的列表一样,您可以访问、操作和合并列表。索引从 1 开始。
为了访问元素,请使用其索引来引用它们。
让我们检索第一个和第二个元素。
> data[1]
$Hardware
[1] "Server"
> data[2]
$Network
[1] "Network Device"
为了删除特定元素,请为其索引分配NULL值。这将减少列表的长度。
让我们删除嵌套列表。您可以通过两种方式执行此操作。第二种方法仅在您已命名列表元素时才有效。
data[5] <- NULL
data$nestedlist <- NULL
假设您有两个来自不同数据源的列表,并且您有一个需要两个数据源的数据的函数。您可以选择合并这两个列表。
monthids <- list(1,2,3,4,5,6,7,8,9,10,11,12)
months <- list("Jan","Feb","Mar","Apr","May","June","July","Aug","Sep","Oct","Nov","Dec")
实现此目的的方法是使用c()函数。
merged.list <- c(monthids,months)
这将产生以下结果。
[1]]
[1] 1
[[2]]
[1] 2
[[3]]
[1] 3
[[4]]
[1] 4
[[5]]
[1] 5
[[6]]
[1] 6
[[7]]
[1] 7
[[8]]
[1] 8
[[9]]
[1] 9
[[10]]
[1] 10
[[11]]
[1] 11
[[12]]
[1] 12
[[13]]
[1] "Jan"
[[14]]
[1] "Feb"
[[15]]
[1] "Mar"
[[16]]
[1] "Apr"
[[17]]
[1] "May"
[[18]]
[1] "June"
[[19]]
[1] "July"
[[20]]
[1] "Aug"
[[21]]
[1] "Sep"
[[22]]
[1] "Oct"
[[23]]
[1] "Nov"
[[24]]
[1] "Dec"
unlist ()函数允许您将列表转换为向量。
myvector <- unlist(merged.list)
此后,所有常见的算术运算符都可以应用于新创建的向量。
数组
数组是具有一个或多个维度的向量。一维数组可以视为向量,二维数组可以视为矩阵。在后台,数据以 n 维矩阵的形式存储。可以使用array()函数创建自己的数组。唯一的限制是数组只能存储数据类型。
您可以按照以下方式创建一个简单的数组。
v1 <- c(1,2,3)
v2 <- c(4,5,6,7,8,9)
result <- array(c(v1,v2),dim = c(3,3,2))
现在结果包含一个包含两个矩阵、三行三列的数组。
, , 1
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
, , 2
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
这里的关键字是<st
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~