R学习 第二篇:矩阵和数组

向量是一维的,只有行这一个维度,没有其他维度。R可以创建更高维度的数据对象,例如,矩阵、数据框、数组,索引高维度的对象时,需要使用元素的下标。这些对象的下标都使用中括号[]和索引,第一个维度是row,第二个维度是column,维度依次增加,索引的格式是:var[row,column,,,]。数组是二维或多维(三维或多于三维),二维数组叫做矩阵。数组元素的类型是相同的,每个维度的元素数量是相同的。数据框是二维对象,每个数据列的数据类型是相同的,不同数据列的数据类型可以不同。

一,数组(array)

R使用arrary()函数创建数组,该函数至少需要两个向量参数:数组的元素值(data)向量,和维度(dim)向量,第三个参数是可选的维度名(dimnames)向量。数据(data)参数是数组的所有元素值向量,维度参数(dim)指定各个维度的元素数量,维度名(dimnames)参数是可选的,用于指定各个维度的名称。

array(data = NA, dim = length(data), dimnames = NULL)

数组的维度是有顺序的,维度参数(dim)的第一个维度是row,第二个维度是column,第三个维度是high,以此类推,数组是按照维度的顺序把数据(data)参数的数据填充到数组中。

严格来说,数组(或矩阵)的长度和维度是固定的,因此不能增加或删除行或列,但可以通过为数组(或矩阵)重新赋值来实现行或列的增加或删除。

1,创建数组

示例:data=c(1:12),dim=c(2:3:2),这说明,数组共有:第一维是2行,第二维是3列,第三维是2项(item),参数dimnames为三个维度的row,column和itme命名。

复制代码
> three_d_array=array(
+     data=c(1:12),
+     dim=c(2,3,2),
+     dimnames=list(
+         c('r1','r2'),
+         c('c1','c2','c3'),
+         c('h1','h2')
+         )
+     )
复制代码

打印的结果如下,其中“ , , h1”,表示第三维的第一个item,数组按照(1,1,1),(2,1,1),(1,2,1),,的顺序填充元素值。

复制代码
, , h1
   c1 c2 c3
r1  1  3  5
r2  2  4  6

, , h2
   c1 c2 c3
r1  7  9 11
r2  8 10 12
复制代码

2,数组的维度和长度

函数dim()返回数组的各个维度的长度,输出的结果按照维度的顺序依次显示:

> dim(three_d_array)
[1] 2 3 2

特别地,函数nrow(),ncol(),用于返回数组的第一个维度,第二个维度的长度:

> nrow(three_d_array)
[1] 2
> ncol(three_d_array)
[1] 3

把函数nrow(),ncol(),dim()应用于向量时,将返回NULL值,R提供另外两个函数NROW(), NCOL(),用于返回数组、矩阵和数据框的第一个维度,第二个维度的长度,这两个函数把向量看作是一维的矩阵。

函数length(),用于返回数组的长度,是数组的各个维度的乘积:

> length(three_d_array)
[1] 12

3,数组的维度的名称

数据和矩阵的每个维度都有名称,使用函数rownames(),colnames()查看数组、矩阵的各行的名称和各列的名称:

> rownames(three_d_array)
[1] "r1" "r2"
> colnames(three_d_array)
[1] "c1" "c2" "c3"

使用函数dimnames(x)查看对象的所有维度的名称:

复制代码
> dimnames(three_d_array)
[[1]]
[1] "r1" "r2"

[[2]]
[1] "c1" "c2" "c3"

[[3]]
[1] "h1" "h2"
复制代码

二,矩阵(matrix)

矩阵是二维数组的特例,本质上也是二维数组。使用函数matrix()创建矩阵,必须传递的参数是数据(data)向量,行数(nrow)或列数(ncol),可选的参数是dimnames参数和byrow参数。

matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL)

byrow参数的默认值是FALSE,表示按照列填充矩阵,这意味着,R首先填充第一列的所有行,再填充第二列的所有行,以此类推:

复制代码
> a_matrix=matrix(
+     data=c(1:6),
+     nrow=2,
+     byrow=FALSE,
+     dimnames = list(
+         c('r1','r2'),
+         c('c1','c2','c3')
+     )
+ )
复制代码

返回的结果如下,矩阵使用data参数,先填充位置(1,1),再填充位置(2,1),以此类推:

> a_matrix
   c1 c2 c3
r1  1  3  5
r2  2  4  6

矩阵只有两个维度,行(row)和列(column),可以使用nrow,ncol,dim函数获得矩阵各个维度的长度,可以使用length函数获得矩阵的长度,即矩阵的元素总数量。

三,索引数组和矩阵

R使用中括号[]表示索引,有四种指定索引的方法(正整数,负整数,逻辑值和元素的名称),下标的整数值从1开始,正整数表示选择该项,负整数表示剔除该项。在不同的维度上用不同的方式指定索引下标,是有效的,每个维度的下标使用逗号分割。如果相应的维度上,下标为空,那么表示该维度的所有元素。索引矩阵和数组的方法相同,只不过矩阵的维度比数组的维度多一个。

1,使用下标索引数组

例如,索引数组,包含所有的行(row),第一个维度的下标是空;选择第二个维度的第1,2列,第二个维度的下标是向量c(1:2);选择第三维度的第一项(item),第三个维度的下标是1:

> three_d_array[,1:2,1]
   c1 c2
r1  1  3
r2  2  4

2,使用元素的名称索引数组

例如,索引数组,包含素有的行(row),第一个维度的下标是空;选择第二个维度的第1,2列,第二个维度的下标是向量c("c1","c2");选择第三个维度的第2个元素,第三个维度的下标是"h2"

> three_d_array[,c("c1","c2"),"h2"]
   c1 c2
r1  7  9
r2  8 10

3,使用逻辑值所有数组

匹配操作符 %in%, 如果左侧的向量的元素能够匹配右侧的向量中的任意元素,那么返回TRUE,否则,返回FALSE。

复制代码
> cols <- colnames(three_d_array) %in% c("c1","c2")
> cols
[1]  TRUE  TRUE FALSE
> hs <- as.vector(dimnames(three_d_array)[[3]]) %in% c("h1")
> hs
[1]  TRUE FALSE
> three_d_array[,cols,hs]
   c1 c2
r1  1  3
r2  2  4
复制代码

 

posted @   悦光阴  阅读(5703)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2015-10-26 SQL Server 小数类型(float 和 decimal)
点击右上角即可分享
微信分享提示