R 数组(建议收藏)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观

前言

在数据分析和科学计算领域,R 语言凭借其强大的统计功能和丰富的可视化工具,成为许多开发者和研究人员的首选工具。然而,对于刚接触 R 语言的初学者而言,理解其核心数据结构可能是一个挑战。其中,“R 数组”作为多维数据存储的基础工具,既是学习 R 语言的必经之路,也是实现复杂计算的关键。本文将从基础概念出发,结合实际案例,逐步讲解 R 数组的创建、操作和应用,帮助读者建立清晰的理解框架,并掌握解决实际问题的能力。


什么是 R 数组?

基本概念与特性

在 R 语言中,数组(Array) 是一种多维数据结构,可以存储相同类型的元素(如数字、字符等),并通过维度(Dimension)来组织这些元素。与向量(Vector)和矩阵(Matrix)类似,数组是 R 中处理结构化数据的核心工具。

关键特性

  • 多维性:数组可以拥有 1 维(即向量)、2 维(即矩阵)或更高维度(如 3 维、4 维等)。
  • 同质性:所有元素必须属于同一数据类型(如数值型、字符型)。
  • 维度标签:每个维度可以自定义名称,便于数据管理。

与其他结构的对比

  • 向量:1 维数组,元素按线性排列。
  • 矩阵:2 维数组,行和列构成二维结构。
  • 数组:N 维数组,支持三维及以上结构(如三维数组可表示“时间 × 行 × 列”数据)。

形象比喻
想象一个图书馆的书架,每一层代表一个维度。例如,一个三维数组可以理解为“书架层 × 书架列 × 书架行”,每个位置对应一本书的编号。通过维度的组合,可以高效存储和检索多维数据。


如何创建 R 数组?

使用 array() 函数

创建数组的核心函数是 array(),其语法为:

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

其中:

  • data:要存储的数据向量。
  • dim:指定数组的维度(如 dim = c(2, 3, 4) 表示三维数组,维度分别为 2、3、4)。
  • dimnames:可选参数,为每个维度指定名称。

示例 1:创建一个 2×3 的数值数组

data <- 1:6  
my_array <- array(data, dim = c(2, 3))  
my_array  

示例 2:添加维度名称

dimnames <- list(  
  rows = c("Row1", "Row2"),  
  cols = c("ColA", "ColB", "ColC")  
)  
my_array_named <- array(data, dim = c(2, 3), dimnames = dimnames)  
my_array_named  

通过 dim() 函数转换其他结构

若已有向量或矩阵,可通过 dim() 函数直接将其转换为数组。例如:

vec <- 1:24  
dim(vec) <- c(2, 3, 4)  # 2 层 × 3 行 × 4 列  
dim(vec)  # 检查维度:[1] 2 3 4  

如何访问和操作 R 数组?

索引与子集提取

数组的元素可以通过维度索引访问。对于 N 维数组,索引格式为 array_name[i, j, k, ...],其中 i, j, k 分别对应各维度的位置。

示例:提取三维数组的元素

data_3d <- array(1:12, dim = c(2, 3, 2))  
data_3d[1, 2, 2]  # 输出:5  

切片与子集选择

使用冒号(:)或 drop = FALSE 参数可提取子数组:

layer1 <- data_3d[1, , ]  # 结果为 3×2 矩阵  
row1 <- data_3d[1, 1, ]  # 结果为 1×2 向量  

数组运算与函数应用

R 数组支持向量化运算,可直接进行加减乘除等操作。此外,apply() 函数族(如 apply()lapply())可对数组的特定维度进行迭代计算。

示例:计算三维数组的每层总和

apply(data_3d, 1, sum)  

R 数组的高级应用与实战案例

案例 1:多维数据分析

假设我们收集了某产品在不同城市、季度和月份的销售数据,可以用三维数组存储:

sales_data <- array(  
  data = rnorm(24, mean = 100, sd = 20),  
  dim = c(2, 3, 4),  
  dimnames = list(  
    cities = c("CityA", "CityB"),  
    quarters = c("Q1", "Q2", "Q3"),  
    months = c("Jan", "Feb", "Mar", "Apr")  
  )  
)  
sum(sales_data["CityA", "Q1", ])  

案例 2:图像数据处理

图像通常以三维数组存储(高度 × 宽度 × 颜色通道)。例如,读取一张 RGB 图像后,可通过数组操作调整颜色:

image_array[, , 2] <- image_array[, , 2] * 2  

案例 3:机器学习中的张量

在深度学习中,输入数据常以多维数组(张量)形式存储。例如,一个包含 100 张图片的数据集可表示为:

data_tensor <- array(rnorm(100 * 28 * 28 * 3), dim = c(100, 28, 28, 3))  

常见问题与解决方案

问题 1:维度不匹配

当对不同维度的数组进行运算时,R 会因维度不一致报错。例如:

array1 <- array(1:6, dim = c(2,3))  
array2 <- array(1:4, dim = c(2,2))  
array1 + array2  # 报错:维度不匹配  

解决方案

  • 确保所有操作的数组维度一致,或使用 dim() 调整维度。

问题 2:索引越界

访问超出数组维度的元素会导致错误。例如:

my_array <- array(1:6, dim = c(2,3))  
my_array[3, 4]  # 报错:索引超出范围  

解决方案

  • 检查维度大小,使用 dim() 函数确认数组的维度。

问题 3:数据类型冲突

若数组包含混合类型数据(如数值与字符),R 会强制转换为字符类型。例如:

mixed_array <- array(c(1, "text"), dim = c(2,1))  

解决方案

  • 确保所有元素类型一致,或改用列表(List)存储异构数据。

结论

R 数组作为多维数据的核心结构,在数据分析、科学计算和机器学习中扮演着重要角色。通过掌握其创建、索引、运算和高级应用,开发者可以高效地处理复杂数据,实现从基础统计到深度学习的多种任务。对于初学者,建议从二维矩阵入手,逐步探索三维及以上结构,结合实际案例加深理解。记住,实践是掌握 R 数组的最佳途径——尝试将日常数据转化为数组形式,并尝试编写自己的代码,你将发现多维数据的魅力远超预期。

希望本文能为你打开 R 数组的大门,助你在数据分析的道路上走得更远!

最新发布