R 数组(Array)完全指南:创建、操作与实战示例
1. 引言在 R 语言中数组Array是一种重要的数据结构用于存储多维数据。与向量Vector和矩阵Matrix相比数组可以拥有两个以上的维度非常适合处理多维表格、图像数据、时间序列等多维场景。本文将系统介绍 R 数组的创建、索引、运算和实际应用并提供丰富的可运行代码示例。2. 数组的基本概念数组是 R 中用于存储同类型元素的多维数据结构。它的核心特点包括多维性数组可以是一维、二维、三维甚至更高维度。同质性数组中的所有元素必须是相同的数据类型如数值、字符、逻辑值。维度属性每个数组都有一个dim属性用于描述各维度的大小。从本质上讲矩阵是二维数组的特例而向量可以看作一维数组。理解数组有助于掌握 R 中更复杂的数据操作。3. 创建数组在 R 中最常用的创建数组的函数是array()。其基本语法为array(data, dim length(data), dimnames NULL)data要填充到数组中的数据通常是向量。dim指定数组各维度大小的整数向量。dimnames可选参数用于给各维度命名。3.1 创建一维数组一维数组本质上等同于向量但显式指定维度后即为数组# 创建一维数组 arr1 - array(1:6, dim 6) print(arr1) # 输出: [1] 1 2 3 4 5 6 查看维度 dim(arr1) # 输出: [1] 63.2 创建二维数组矩阵二维数组即矩阵通过dim c(行数, 列数)指定# 创建 2 行 3 列的二维数组 arr2 - array(1:6, dim c(2, 3)) print(arr2) # [,1] [,2] [,3] # [1,] 1 3 5 # [2,] 2 4 6 查看维度 dim(arr2) # 输出: [1] 2 3注意R 默认按列填充数据即先填满第一列再填第二列以此类推。3.3 创建三维数组三维数组是数组最典型的应用场景例如存储多个矩阵的堆叠# 创建 2 行 3 列 2 层的三维数组 arr3 - array(1:12, dim c(2, 3, 2)) print(arr3) # , , 1 # # [,1] [,2] [,3] # [1,] 1 3 5 # [2,] 2 4 6 # # , , 2 # # [,1] [,2] [,3] # [1,] 7 9 11 # [2,] 8 10 12 查看维度 dim(arr3) # 输出: [1] 2 3 23.4 使用 dim() 将向量转换为数组除了array()函数还可以通过给向量添加dim属性来创建数组# 先创建向量 vec - 1:8 通过 dim() 赋予维度属性 dim(vec) - c(2, 2, 2) print(vec) , , 1 [,1] [,2] [1,] 1 3 [2,] 2 4 , , 2 [,1] [,2] [1,] 5 7 [2,] 6 83.5 为数组添加维度名称使用dimnames参数可以为各维度命名使数据更易读# 创建带维度名称的三维数组 arr_named - array( 1:12, dim c(2, 3, 2), dimnames list( 行 c(行1, 行2), 列 c(列A, 列B, 列C), 层 c(第一层, 第二层) ) ) print(arr_named) # , , 层 第一层 # # 列 # 行 列A 列B 列C # 行1 1 3 5 # 行2 2 4 6 # # , , 层 第二层 # # 列 # 行 列A 列B 列C # 行1 7 9 11 # 行2 8 10 124. 数组的索引与访问数组的索引方式与矩阵类似通过方括号[]指定各维度的下标。三维数组的索引格式为数组[行, 列, 层]。4.1 访问单个元素arr - array(1:12, dim c(2, 3, 2)) 访问第 1 行、第 2 列、第 1 层的元素 arr[1, 2, 1] # 输出: [1] 3 访问第 2 行、第 3 列、第 2 层的元素 arr[2, 3, 2] # 输出: [1] 124.2 访问整行、整列或整层arr - array(1:12, dim c(2, 3, 2)) 访问第 1 层的所有元素即整个矩阵 arr[, , 1] [,1] [,2] [,3] [1,] 1 3 5 [2,] 2 4 6 访问第 1 层第 2 列的所有行 arr[, 2, 1] # 输出: [1] 3 4 访问第 2 行第 1 层的所有列 arr[2, , 1] # 输出: [1] 2 4 64.3 使用维度名称索引如果创建数组时指定了维度名称可以直接用名称访问arr_named - array( 1:12, dim c(2, 3, 2), dimnames list( 行 c(行1, 行2), 列 c(列A, 列B, 列C), 层 c(第一层, 第二层) ) ) 按名称访问 arr_named[行1, 列B, 第一层] # 输出: [1] 3 arr_named[行2, , 第二层] # 输出: 列A 列B 列C # 8 10 124.4 使用向量索引多个元素arr - array(1:12, dim c(2, 3, 2)) 访问第 1 层第 1 行和第 2 行的第 1、3 列 arr[c(1, 2), c(1, 3), 1] [,1] [,2] [1,] 1 5 [2,] 2 65. 数组的常用操作5.1 查看数组的维度与长度arr - array(1:24, dim c(2, 3, 4)) 查看维度 dim(arr) # 输出: [1] 2 3 4 查看元素总个数 length(arr) # 输出: [1] 24 查看维度名称 dimnames(arr) # 输出: NULL未命名时5.2 数组的算术运算数组支持与标量、向量以及其他数组的算术运算遵循 R 的循环规则arr - array(1:12, dim c(2, 3, 2)) 与标量运算 arr 10 , , 1 [,1] [,2] [,3] [1,] 11 13 15 [2,] 12 14 16 , , 2 [,1] [,2] [,3] [1,] 17 19 21 [2,] 18 20 22 两个相同维度的数组相加 arr2 - array(rep(1, 12), dim c(2, 3, 2)) arr arr2 , , 1 [,1] [,2] [,3] [1,] 2 4 6 [2,] 3 5 7 , , 2 [,1] [,2] [,3] [1,] 8 10 12 [2,] 9 11 135.3 数组的汇总统计arr - array(1:12, dim c(2, 3, 2)) 求和 sum(arr) # 输出: [1] 78 平均值 mean(arr) # 输出: [1] 6.5 最大值与最小值 max(arr) # 输出: [1] 12 min(arr) # 输出: [1] 1 按维度求和margin 1 表示按行2 表示按列3 表示按层 apply(arr, 1, sum) # 按行求和输出: [1] 36 42 apply(arr, 2, sum) # 按列求和输出: [1] 18 22 26 apply(arr, 3, sum) # 按层求和输出: [1] 21 575.4 使用 apply() 进行维度运算apply()函数是数组操作的核心工具可以对指定维度应用任意函数arr - array(1:12, dim c(2, 3, 2)) 计算每一层的平均值 apply(arr, 3, mean) 输出: [1] 3.5 9.5 计算每一列的标准差 apply(arr, 2, sd) 输出: [1] 3.559026 3.559026 3.559026 自定义函数计算每一行的最大值与最小值之差 apply(arr, 1, function(x) max(x) - min(x)) 输出: [1] 10 105.5 数组的转置使用aperm()函数可以重新排列数组的维度顺序arr - array(1:12, dim c(2, 3, 2)) 将维度顺序从 (行, 列, 层) 调整为 (层, 行, 列) arr_t - aperm(arr, c(3, 1, 2)) dim(arr_t) # 输出: [1] 2 2 3 print(arr_t) , , 1 [,1] [,2] [1,] 1 2 [2,] 7 8 , , 2 [,1] [,2] [1,] 3 4 [2,] 9 10 , , 3 [,1] [,2] [1,] 5 6 [2,] 11 126. 数组与矩阵、向量的转换6.1 数组转换为矩阵arr - array(1:12, dim c(2, 3, 2)) 将三维数组转换为矩阵按层合并 mat - matrix(arr, nrow dim(arr)[1] * dim(arr)[3], ncol dim(arr)[2]) print(mat) [,1] [,2] [,3] [1,] 1 3 5 [2,] 2 4 6 [3,] 7 9 11 [4,] 8 10 126.2 矩阵转换为数组mat - matrix(1:12, nrow 4, ncol 3) 将矩阵转换为三维数组 arr - array(mat, dim c(2, 2, 3)) print(arr) , , 1 [,1] [,2] [1,] 1 3 [2,] 2 4 , , 2 [,1] [,2] [1,] 5 7 [2,] 6 8 , , 3 [,1] [,2] [1,] 9 11 [2,] 10 126.3 数组转换为向量arr - array(1:12, dim c(2, 3, 2)) 使用 as.vector() 或 c() 展平数组 vec - as.vector(arr) print(vec) 输出: [1] 1 2 3 4 5 6 7 8 9 10 11 127. 实战案例7.1 案例一学生成绩多维分析假设有 3 个班级每个班级 4 名学生参加了 3 门考试可以用三维数组存储数据# 生成模拟成绩数据3 个班级 × 4 名学生 × 3 门课程 set.seed(42) scores - array( round(runif(36, 60, 100)), dim c(4, 3, 3), dimnames list( 学生 c(张三, 李四, 王五, 赵六), 课程 c(数学, 语文, 英语), 班级 c(一班, 二班, 三班) ) ) print(scores) 计算每个班级的平均分 班级平均分 - apply(scores, 3, mean) print(班级平均分) 一班 二班 三班 82.50000 82.41667 82.58333 计算每门课程的平均分 课程平均分 - apply(scores, 2, mean) print(课程平均分) 数学 语文 英语 82.88889 82.11111 82.50000 找出每个班级的最高分学生 apply(scores, 3, function(x) { idx - which(x max(x), arr.ind TRUE) paste0(最高分: , max(x), 学生: , rownames(x)[idx[1, 1]]) }) 一班 二班 三班 最高分: 99学生: 李四 最高分: 99学生: 王五 最高分: 98学生: 赵六7.2 案例二图像数据表示灰度图像可以表示为二维矩阵而彩色图像通常用三维数组表示高度 × 宽度 × 颜色通道# 模拟一张 4×4 的 RGB 彩色图像4 行 × 4 列 × 3 通道 set.seed(123) image_data - array( sample(0:255, 4 * 4 * 3, replace TRUE), dim c(4, 4, 3), dimnames list( 行 paste0(行, 1:4), 列 paste0(列, 1:4), 通道 c(R, G, B) ) ) 查看红色通道 image_data[, , R] 列 行 列1 列2 列3 列4 行1 31 79 51 14 行2 67 42 50 43 行3 14 25 100 51 行4 41 17 77 32 计算整张图像的平均亮度三个通道的平均值 平均亮度 - apply(image_data, c(1, 2), mean) print(平均亮度) 列1 列2 列3 列4 行1 111.3333 151.3333 126.6667 105.3333 行2 139.3333 126.6667 151.3333 126.6667 行3 105.3333 111.3333 151.3333 126.6667 行4 126.6667 105.3333 151.3333 111.33337.3 案例三时间序列的多维存储对于多个站点、多个指标、多个时间点的数据三维数组是理想的存储结构# 模拟 3 个站点、2 个指标温度、湿度、7 天的数据 set.seed(2024) weather - array( round(runif(3 * 2 * 7, 0, 40), 1), dim c(3, 2, 7), dimnames list( 站点 c(北京, 上海, 广州), 指标 c(温度, 湿度), 日期 paste0(第, 1:7, 天) ) ) 查看第 1 天的数据 weather[, , 第1天] 指标 站点 温度 湿度 北京 20.3 31.0 上海 25.7 12.4 广州 30.1 22.1 计算每个站点一周的平均温度 apply(weather[, 温度, ], 1, mean) 北京 上海 广州 20.61429 22.70000 22.51429 找出每个站点温度最高的一天 apply(weather[, 温度, ], 1, which.max) 北京 上海 广州 5 4 68. 数组的注意事项与常见陷阱8.1 数据填充顺序R 数组默认按列填充数据这与许多其他编程语言如 Python 的 NumPy 默认按行填充不同容易造成混淆# 按列填充 arr_col - array(1:6, dim c(2, 3)) print(arr_col) # [,1] [,2] [,3] # [1,] 1 3 5 # [2,] 2 4 6 如需按行填充需要转置 arr_row - t(array(1:6, dim c(3, 2))) print(arr_row) [,1] [,2] [,3] [1,] 1 2 3 [2,] 4 5 68.2 维度丢失问题当索引数组的某个维度时R 默认会丢弃该维度可能导致结果降维arr - array(1:12, dim c(2, 3, 2)) 访问第 1 层时返回的是矩阵维度为 2×3 layer1 - arr[, , 1] dim(layer1) # 输出: [1] 2 3 如果希望保留三维结构使用 drop FALSE layer1_keep - arr[, , 1, drop FALSE] dim(layer1_keep) # 输出: [1] 2 3 18.3 数组元素类型必须一致# 混合类型会被强制转换 mixed - array(c(1, 2, a, b), dim c(2, 2)) print(mixed) # [,1] [,2] # [1,] 1 a # [2,] 2 b # 注意数值被强制转换为字符类型8.4 使用 c() 展平数组时的顺序arr - array(1:12, dim c(2, 3, 2)) c() 按列优先顺序展平 flat - c(arr) print(flat) 输出: [1] 1 2 3 4 5 6 7 8 9 10 11 129. 总结本文系统介绍了 R 数组的创建、索引、运算和实战应用核心要点总结如下创建使用array()函数或通过dim()属性赋值创建多维数组。索引通过方括号按各维度下标访问元素支持名称索引和向量索引。运算数组支持标量运算、逐元素运算配合apply()可进行灵活的维度聚合。转换数组可以与矩阵、向量相互转换aperm()可重排维度顺序。实战数组非常适合存储成绩数据、图像数据、多维时间序列等结构化数据。掌握数组操作是深入学习 R 语言数据分析和科学计算的重要基础。建议读者结合本文代码动手实践并尝试将数组应用到自己的真实数据场景中。

相关新闻

鼠标监听器和动作监听器运用及部分绘制功能的实现

鼠标监听器和动作监听器运用及部分绘制功能的实现

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、整体思路二、涉及知识点(含回顾内容)1.Graphics2.两个数学工具三、DrawUI1. 窗体2. 功能按钮3. 监听器四、DrawListener1.实现接口2.…

2026/8/20 15:39:55 阅读更多 →
FreeType 字体引擎入门指南:从编译到字符像素转换

FreeType 字体引擎入门指南:从编译到字符像素转换

目录 一、FreeType的定义及作用 二、FreeType的源码下载与编译 环境: 源码下载: 源码编译: 三、FreeType转换实战 初始化字体库 单个字符的转换 字符串的转换 转换思路 示例1 示例2 示例3 示例4 示例5 四、释放 五、结语 一…

2026/8/21 16:38:18 阅读更多 →
FreeRTOS队列深度解析:从原理到实战,掌握嵌入式多任务通信核心

FreeRTOS队列深度解析:从原理到实战,掌握嵌入式多任务通信核心

1. 从“单打独斗”到“协同作战”:为什么嵌入式开发离不开队列 在嵌入式系统开发,尤其是基于FreeRTOS这类实时操作系统的项目中,我们常常会面临一个核心矛盾:多个任务(Task)之间如何安全、高效地交换数据&a…

2026/8/20 18:22:57 阅读更多 →

最新新闻

Slater框架集成BM25与Graphiti:数据库原生智能搜索实战

Slater框架集成BM25与Graphiti:数据库原生智能搜索实战

如果你是一位长期关注数据库和搜索技术的开发者,最近可能被一个词刷屏了: BM25 。这个经典的搜索排序算法,似乎正从传统搜索引擎领域,悄然渗透到新一代的数据库和开发框架中。 这背后是一个明确的趋势:应用对“搜索…

2026/8/21 19:43:03 阅读更多 →
前端面试失败案例解析:技术深度与工程化能力的关键

前端面试失败案例解析:技术深度与工程化能力的关键

1. 面试场景还原:三位候选人的基本情况 今天连续面试了三位女性前端开发候选人,整个过程让我感触颇深。作为技术面试官,我习惯在面试结束后立即记录下关键观察点。这三位候选人学历背景都不错,都有1-3年的工作经验,但最…

2026/8/21 19:43:03 阅读更多 →
Coze工作流实战:低代码AI应用开发与API集成指南

Coze工作流实战:低代码AI应用开发与API集成指南

这次我们来看一个名为“龙虾调Coze工作流”的项目。从标题和网络热词来看,这很可能是一个基于字节跳动旗下AI Bot开发平台“Coze”(国内称“扣子”)构建的自动化工作流。Coze平台允许用户通过拖拽节点的方式,将大语言模型、知识库…

2026/8/21 19:43:03 阅读更多 →
如何使用混合开发 module

如何使用混合开发 module

如何使用混合开发 module 本文介绍如何在ohos工程中引用flutter_module工程。 ohos工程,OpenHarmony原生工程,可由Deveco Studio创建。flutter_module工程,flutter子模块工程,可由 flutter 命令行创建。 环境准备 使用 flutte…

2026/8/21 19:43:03 阅读更多 →
电脑上安装 Docker Compose,安装WSL提示灾难性故障:Wsl/CallMsi/Install/E_UNEXPECTED...如何解决?

电脑上安装 Docker Compose,安装WSL提示灾难性故障:Wsl/CallMsi/Install/E_UNEXPECTED...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者&…

2026/8/21 19:43:03 阅读更多 →
3步把微信聊天记录导出成文档:免费又完整的 WeChatMsg 快速上手指南

3步把微信聊天记录导出成文档:免费又完整的 WeChatMsg 快速上手指南

3步把微信聊天记录导出成文档:免费又完整的 WeChatMsg 快速上手指南 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Tren…

2026/8/21 19:42:03 阅读更多 →

日新闻

机场边检旅客定位系统国产化白皮书:算法、硬件、底座平台全程自主

机场边检旅客定位系统国产化白皮书:算法、硬件、底座平台全程自主

前言随着国家数字基础设施信创替代、关键技术自主可控战略持续深化,口岸智慧安防、边检智能管控领域正全面进入国产化、自主化、安全可控升级周期。当前国内机场边检旅客识别与定位体系长期依赖国外商用视觉算法、进口成像硬件、闭源通用计算平台,存在核…

2026/8/21 0:00:42 阅读更多 →
别再把“数字孪生”当空间智能了!镜像视界揭开四维时空的真正面纱

别再把“数字孪生”当空间智能了!镜像视界揭开四维时空的真正面纱

别再把“数字孪生”当空间智能了!镜像视界揭开四维时空的真正面纱当下数字化建设浪潮中,很多项目将三维可视化、视频贴图叠加的数字孪生等同于空间智能。传统数字孪生更多停留在三维场景复刻,擅长把物理世界“画出来、展示出来”,…

2026/8/21 0:00:42 阅读更多 →
105、车载温度范围-40°C到85°C的影像质量一致性——ISP参数温漂补偿与产线标定策略

105、车载温度范围-40°C到85°C的影像质量一致性——ISP参数温漂补偿与产线标定策略

105、车载温度范围-40C到85C的影像质量一致性——ISP参数温漂补偿与产线标定策略 去年冬天在北方某车厂做A样评审,凌晨四点的黑河试验场,零下三十三度。客户拿了一台冷启动的车,中控屏上倒车影像全是雪花噪点,暗部细节直接糊成一片。我第一反应是sensor温度没上来,暗电流…

2026/8/21 0:00:42 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/21 3:21:33 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/21 0:02:09 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/21 6:07:56 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/21 16:42:28 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/20 21:46:49 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/21 0:14:22 阅读更多 →