当前位置: 首页 > news >正文

10-R数组

R 数组

数组也是 R 语言的对象,R 语言可以创建一维或多维数组。

R 语言数组是一个同一类型的集合,前面我们学的矩阵 matrix 其实就是一个二维数组。

向量、矩阵、数组关系可以看下图:

img

R 语言数组创建使用 array() 函数,该函数使用向量作为输入参数,可以使用 dim 设置数组维度。

array() 函数语法格式如下:

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

参数说明:

  • data - 指定数组的数据源,可以是一个向量、矩阵或列表。
  • dim - 指定数组的维度,可以是一个整数向量或一个表示维度的元组,默认是一维数组。例如,dim = c(2, 3, 4) 表示创建一个 2x3x4 的三维数组。
  • dimnames - 可选参数,用于指定数组每个维度的名称,可以是一个包含维度名称的列表。

在 R 中,数组索引是从 1 开始的,与其他编程语言的习惯有所不同。

此外,R 还提供了丰富的函数和操作符用于处理数组数据,如索引、切片、重塑、聚合等。

在 R 中,可以使用**矩阵(Matrix)列表(List)**来表示多维数组。

**矩阵(Matrix):**矩阵是 R 中最常用的表示数组的形式,它是一个二维的结构,具有固定的行数和列数。

可以使用 matrix() 函数创建矩阵,指定数据元素和维度。

实例:

# 创建一个3x3的矩阵
my_matrix <- matrix(c(1, 2, 3, 4, 5, 6, 7, 8, 9), nrow = 3, ncol = 3)
print(my_matrix)

执行以上代码输出结果为:

     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9

列表(List):列表是 R 中更通用的多维数组形式,它可以包含不同类型的元素,并且每个元素可以是一个矩阵、向量或其他数据结构。

实例:

# 创建一个包含矩阵和向量的列表
my_list <- list(matrix(c(1, 2, 3, 4), nrow = 2), c(5, 6, 7))
print(my_list)

执行以上代码输出结果为:

[[1]]
     [,1] [,2]
[1,]    1    3
[2,]    2    4

[[2]]
[1] 5 6 7

除了矩阵和列表,R 还提供了其他数据结构来表示多维数组,如数组(Array)和数据帧(Data Frame)。

下面是一些示例来演示 array() 函数的使用:

使用向量创建一维数组:

实例:

my_vector <- c(1, 2, 3, 4)
my_array <- array(my_vector, dim = c(4))
print(my_array)

执行以上代码输出结果为:

[1] 1 2 3 4

以下实例我们创建一个 3 行 3 列的的二维数组:

实例:

# 创建两个不同长度的向量
vector1 <- c(5,9,3)
vector2 <- c(10,11,12,13,14,15)

# 创建数组
result <- array(c(vector1,vector2),dim = c(3,3,2))
print(result)

执行以上代码输出结果为:

, , 1

     [,1] [,2] [,3]
[1,]    5   10   13
[2,]    9   11   14
[3,]    3   12   15

, , 2

     [,1] [,2] [,3]
[1,]    5   10   13
[2,]    9   11   14
[3,]    3   12   15

使用 dimnames 参数来设置各个维度的名称::

实例:

# 创建两个不同长度的向量
vector1 <- c(5,9,3)
vector2 <- c(10,11,12,13,14,15)
column.names <- c("COL1","COL2","COL3")
row.names <- c("ROW1","ROW2","ROW3")
matrix.names <- c("Matrix1","Matrix2")

# 创建数组,并设置各个维度的名称
result <- array(c(vector1,vector2),dim = c(3,3,2),dimnames = list(row.names,column.names,matrix.names))
print(result)

执行以上代码输出结果为:

, , Matrix1

     COL1 COL2 COL3
ROW1    5   10   13
ROW2    9   11   14
ROW3    3   12   15

, , Matrix2

     COL1 COL2 COL3
ROW1    5   10   13
ROW2    9   11   14
ROW3    3   12   15

访问数组元素

在 R 语言中,可以使用索引操作符 [ ] 来访问多维数组的元素。

索引操作符允许您按照指定的索引位置获取数组中的特定元素。

如果想获取数组元素,可以通过使用元素的列索引和行索引,类似坐标形式。

访问单个元素:

实例:

my_array <- array(1:12, dim = c(2, 3, 2))  # 创建一个3维数组

element <- my_array[2,1, 2]  # 访问第一个维度为2,第二个维度为1,第三个维度为2的元素
print(my_array)
print(element)

执行以上代码输出结果为:

, , 1

     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6

, , 2

     [,1] [,2] [,3]
[1,]    7    9   11
[2,]    8   10   12

[1] 8

访问多个元素:

实例:

my_array <- array(1:12, dim = c(2, 3, 2))  # 创建一个3维数组
elements <- my_array[c(1, 2), c(2, 3), c(1, 2)]  # 访问多个元素,其中每个维度的索引分别为1和2
print(my_array)
print(elements)

执行以上代码输出结果为:

, , 1

     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6

, , 2

     [,1] [,2] [,3]
[1,]    7    9   11
[2,]    8   10   12

, , 1

     [,1] [,2]
[1,]    3    5
[2,]    4    6

, , 2

     [,1] [,2]
[1,]    9   11
[2,]   10   12

访问二维数组的元素:

实例:

# 创建两个不同长度的向量
vector1 <- c(5,9,3)
vector2 <- c(10,11,12,13,14,15)
column.names <- c("COL1","COL2","COL3")
row.names <- c("ROW1","ROW2","ROW3")
matrix.names <- c("Matrix1","Matrix2")

# 创建数组
result <- array(c(vector1,vector2),dim = c(3,3,2),dimnames = list(row.names, column.names, matrix.names))

# 显示数组第二个矩阵中第三行的元素
print(result[3,,2])

# 显示数组第一个矩阵中第一行第三列的元素
print(result[1,3,1])

# 输出第二个矩阵
print(result[,,2])

执行以上代码输出结果为:

COL1 COL2 COL3 
   3   12   15 
[1] 13
     COL1 COL2 COL3
ROW1    5   10   13
ROW2    9   11   14
ROW3    3   12   15

使用逻辑条件进行筛选:

实例:

my_array <- array(1:12, dim = c(2, 3, 2))  # 创建一个3维数组
filtered_elements <- my_array[my_array > 5]  # 选择大于5的元素
print(filtered_elements)  # 输出:6 7 8 9 10 11 12

操作数组元素

由于数组是由多个维度的矩阵组成,所以我们可以通过访问矩阵的元素来访问数组元素。

实例:

# 创建两个不同长度的向量
vector1 <- c(5,9,3)
vector2 <- c(10,11,12,13,14,15)

# 创建数组
array1 <- array(c(vector1,vector2),dim = c(3,3,2))

# 创建两个不同长度的向量
vector3 <- c(9,1,0)
vector4 <- c(6,0,11,3,14,1,2,6,9)
array2 <- array(c(vector3,vector4),dim = c(3,3,2))

# 从数组中创建矩阵
matrix1 <- array1[,,2]
matrix2 <- array2[,,2]

# 矩阵相加
result <- matrix1+matrix2
print(result)

执行以上代码输出结果为:

     [,1] [,2] [,3]
[1,]    7   19   19
[2,]   15   12   14
[3,]   12   12   26

另外我们可以使用 apply() 元素对数组元素进行跨维度计算,语法格式如下:

apply(X, MARGIN, FUN, ...)

参数说明:

  • X:要应用函数的数组或矩阵。
  • MARGIN:指定应用函数的维度,可以是1表示行,2表示列,或者c(1, 2)表示同时应用于行和列。
  • FUN:要应用的函数,可以是内置函数(如meansum等)或自定义函数。
  • ...:可选参数,用于传递给函数的其他参数。

以下我们使用 apply() 函数来计算数组两个矩阵中每一行对数字之和。

实例:

# 创建两个不同长度的向量
vector1 <- c(5,9,3)
vector2 <- c(10,11,12,13,14,15)

# 创建数组
new.array <- array(c(vector1,vector2),dim = c(3,3,2))
print(new.array)

# 计算数组中所有矩阵第一行的数字之和
result <- apply(new.array, c(1), sum)
print(result)

执行以上代码输出结果为:

, , 1

     [,1] [,2] [,3]
[1,]    5   10   13
[2,]    9   11   14
[3,]    3   12   15

, , 2

     [,1] [,2] [,3]
[1,]    5   10   13
[2,]    9   11   14
[3,]    3   12   15

[1] 56 68 60

对矩阵的行或列应用内置函数:

实例:

# 创建一个3x3的矩阵
my_matrix <- matrix(1:9, nrow = 3)
# 对每列应用sum函数
col_sums <- apply(my_matrix, 2, sum)
print(col_sums)

执行以上代码输出结果为:

[1]  6 15 24

对矩阵的行或列应用自定义函数:

实例:

# 创建一个3x3的矩阵
my_matrix <- matrix(1:9, nrow = 3)
# 自定义函数:计算每行的平均值
row_mean <- function(x) {
  return(mean(x))
}
# 对每行应用row_mean函数
row_means <- apply(my_matrix, 1, row_mean)
print(row_means)

执行以上代码输出结果为:

[1] 4 5 6

对数组的多个维度同时应用函数:

实例:

# 创建一个3维数组
my_array <- array(1:12, dim = c(2, 3, 2))
# 对第一个和第三个维度同时应用mean函数
result <- apply(my_array, c(1, 3), mean)
print(result)

执行以上代码输出结果为:

     [,1] [,2]
[1,]    3    9
[2,]    4   10
函数:计算每行的平均值
row_mean <- function(x) {
  return(mean(x))
}
# 对每行应用row_mean函数
row_means <- apply(my_matrix, 1, row_mean)
print(row_means)

执行以上代码输出结果为:

[1] 4 5 6

对数组的多个维度同时应用函数:

实例:

# 创建一个3维数组
my_array <- array(1:12, dim = c(2, 3, 2))
# 对第一个和第三个维度同时应用mean函数
result <- apply(my_array, c(1, 3), mean)
print(result)

执行以上代码输出结果为:

     [,1] [,2]
[1,]    3    9
[2,]    4   10

相关文章:

  • LeetCode 热题 100_在排序数组中查找元素的第一个和最后一个位置(65_34_中等_C++)(二分查找)(一次二分查找+挨个搜索;两次二分查找)
  • 独立开发者如何寻找产品设计灵感
  • 大规模 RDMA AI 组网技术创新:算法和可编程硬件的深度融合
  • 基于Spring Boot的兴顺物流管理系统设计与实现(LW+源码+讲解)
  • eclips 快捷键
  • java方法学习
  • 探索 Peewee:轻量级 Python ORM 简明指南
  • 更改visual studio 2022 默认NuGet包路径
  • 【uni-app】对齐胶囊容器组件
  • 基于SpringBoot实现的宠物领养系统平台功能七
  • 华为guass在dbever和springboot配置操作
  • 大厂出品!三个新的 DeepSeek 平替网站
  • 【AcWing】动态规划-线性DP -选数异或
  • springboot408-基于Java的樱洵宾馆住宿管理系统(源码+数据库+纯前后端分离+部署讲解等)
  • JDK源码系列(二)
  • 第44天:Web开发-JavaEE应用反射机制类加载器利用链成员变量构造方法抽象方法
  • 代码随想录刷题day28|(栈与队列篇:栈)232.用栈实现队列
  • pycharm中配置PyQt6详细教程
  • Turborepo 使用配置
  • 深入探讨Web应用开发:从前端到后端的全栈实践
  • 沈阳一超市疑借领养名义烹食流浪狗,当地市监局:已收到多起投诉
  • 上海能源科技发展有限公司原董事长李海瑜一审获刑13年
  • 淡马锡辟谣:淡马锡和太白投资未在中国销售任何投资产品或金融工具
  • “80后”李灿已任重庆市南川区领导,此前获公示拟提名为副区长人选
  • 重温经典|开播20周年,仙剑的那些幕后你知道吗?
  • 新华每日电讯:给“男性妇科病论文”开一剂复方药