R语言学习笔记5-数据结构-多维数组

R语言学习笔记5-数据结构-多维数组

多维数组(array)介绍

多维数组是一种用于存储多维数据的数据结构,与矩阵相似但可以具有超过两个维度

特点和用途

1. 多维数据结构 :可以是三维、四维甚至更高维度的数据结构,由多个维度的索引组成
2. 统计和科学计算 :适用于存储和操作高维数据,例如立方体数据(三维数组)、四维数据集等
3. 元素访问和运算:支持类似于矩阵的索引和运算,但需要指定多个维度

创建多维数组

可使用 array() 函数创建多维数组, 其中dim对应单词dimension,表示纬度

r 复制代码
array(data, dim = c(dim1, dim2, ...))

其中 data 是数组的元素,dim 是一个向量,指定数组每个维度的大小

r 复制代码
# 创建一个三维数组
arr <- array(1:24, dim = c(2, 3, 4))
print(arr)

输出:

r 复制代码
, , 1

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

, , 2

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

, , 3

     [,1] [,2] [,3]
[1,]   13   15   17
[2,]   14   16   18

, , 4

     [,1] [,2] [,3]
[1,]   19   21   23
[2,]   20   22   24

多维数组的索引和切片

与矩阵类似,可以使用索引访问和操作多维数组的元素

r 复制代码
# 访问多维数组元素
element <- arr[1, 2, 3]  # 访问第一行,第二列,第三层的元素
print(element)  # 输出 15

# 修改多维数组元素
arr[1, 2, 3] <- 100
print(arr[1, 2, 3])  # 输出 100

多维数组的运算

可对多维数组进行类似于矩阵的运算,如加法、乘法等

r 复制代码
# 创建两个三维数组
arr1 <- array(1:24, dim = c(2, 3, 4))
arr2 <- array(24:1, dim = c(2, 3, 4))

# 加法运算
arr_sum <- arr1 + arr2
print(arr_sum)

获取多维数组的维度和属性

可以使用 dim() 函数获取多维数组的维度信息

r 复制代码
# 获取多维数组的维度
arr_dims <- dim(arr1)
print(arr_dims)  # 输出 2 3 4,表示 2 行 3 列 4 层

多维数组的合并和拆分

可使用 abind 包中的函数将多个数组按照指定的维度进行合并,或者使用索引进行拆分

r 复制代码
library(abind)

# 合并多个数组
arr1 <- array(1:12, dim = c(2, 3, 2))
arr2 <- array(13:24, dim = c(2, 3, 2))
arr_combined <- abind(arr1, arr2, along = 3)
print(arr_combined)

# 输出:
# , , 1
# 
#      [,1] [,2] [,3]
# [1,]    1    3    5
# [2,]    2    4    6
# 
# , , 2
# 
#      [,1] [,2] [,3]
# [1,]    7    9   11
# [2,]    8   10   12
# 
# , , 3
# 
#      [,1] [,2] [,3]
# [1,]   13   15   17
# [2,]   14   16   18
# 
# , , 4
# 
#      [,1] [,2] [,3]
# [1,]   19   21   23
# [2,]   20   22   24

# 拆分多维数组
arr_split <- arr_combined[, , 1:2]
print(arr_split)

along 参数指定了沿着哪个维度合并数组,也就是说它确定了在合并多个数组时,这些数组如何沿着指定的维度进行对齐和连接,这里 along = 3 意味着 arr1 和 arr2 在第三维度(也就是在层数或深度上)进行合并

多维数组的逻辑操作

可对多维数组的元素进行逻辑判断和条件筛选,获取满足条件的子集

r 复制代码
# 逻辑操作
arr1 <- array(1:12, dim = c(2, 3, 2))

# 判断大于 5 的元素
arr_above_5 <- arr1[arr1 > 5]
print(arr_above_5)

多维数组的转置和重塑

可使用 aperm() 函数进行多维数组的转置操作,或使用 array_reshape() 函数重新调整数组的维度结构

r 复制代码
# 旋转数组
arr_rotated <- aperm(arr1, c(3, 2, 1))  # 交换第1维和第3维
print(arr_rotated)

# 翻转数组的某一维
arr_flipped <- arr1[, , 2:1]  # 翻转第3维
print(arr_flipped)

# 重塑数组维度
arr_reshaped <- array_reshape(arr1, c(3, 4))
print(arr_reshaped )

多维数组的元素操作

可对多维数组的每个元素应用函数或进行逐元素的数学操作

r 复制代码
# 应用函数到每个元素
arr_squared <- arr1 ^ 2

# 逐元素加法
arr_sum <- arr1 + 10

多维数组的统计函数

R 提供了多维数组的统计函数,这些函数可对特定维度进行汇总计算,如求和、均值、最大值、最小值等

r 复制代码
# 计算每层的均值
mean_per_layer <- apply(arr1, c(1, 2), mean)
print(mean_per_layer)

# 计算每列的总和
sum_per_column <- apply(arr1, 2, sum)
print(sum_per_column)

多维数组的循环操作

可使用 for 循环遍历数组的各个维度来进行更复杂的操作

r 复制代码
# 计算每个切片的均值
for (i in 1:dim(arr1)[3]) {
  slice_mean <- mean(arr1[, , i])
  print(paste("Mean of slice", i, "is", slice_mean))
}

使用reshape2包的melt()和dcast()函数

reshape2 包提供了 melt() 和 dcast() 函数来处理和转换数据结构

r 复制代码
library(reshape2)

# 将多维数组转换为长格式数据框
melted_arr <- melt(arr1)
print(melted_arr)

# 从长格式数据框转换回多维数组
arr_recast <- dcast(melted_arr, Var1 + Var2 ~ Var3, value.var = "value")
print(arr_recast)

利用purrr包对多维数组进行函数应用

purrr 包提供了功能强大的工具来对数组进行复杂的函数操作

r 复制代码
library(purrr)

# 对每个切片应用函数
apply_fun <- map(arr1, ~mean(.x))  # 计算每个切片的均值
print(apply_fun)

对多维数组进行条件筛选和替换

可对数组进行条件筛选,并根据条件对元素进行修改

r 复制代码
# 将小于 5 的元素替换为 0
arr1[arr1 < 5] <- 0
print(arr1)

多维数组的子集选择

可以利用逻辑子集选择对数组进行筛选

r 复制代码
# 获取第一个切片中大于 4 的元素
arr_subset <- arr1[ , , 1][arr1[ , , 1] > 4]
print(arr_subset)

使用data.table包对多维数组进行高效操作

data.table 包提供了高效的数据处理能力,可以用于对数组数据的处理和分析

r 复制代码
library(data.table)

# 将数组转换为 data.table
dt <- as.data.table(arr1, keep.rownames = TRUE)
print(dt)

# 使用 data.table 进行操作
dt_summary <- dt[, .(Sum = sum(V1)), by = rn]
print(dt_summary)

使用tidyverse进行多维数组的处理

tidyverse 包提供了强大的数据处理功能,可以用于对数组进行复杂的数据转换操作

r 复制代码
library(tidyverse)

# 将数组转换为 tibble
arr_tibble <- tibble::as_tibble(arr1, .name_repair = "minimal")
print(arr_tibble)

# 使用 dplyr 对 tibble 进行数据操作
arr_summary <- arr_tibble %>%
  group_by(dim1, dim2) %>%
  summarize(mean_value = mean(value))
print(arr_summary)
相关推荐
天天进步201519 小时前
【Nanobrowser源码分析4】交互篇: 从指令到动作:模拟点击、滚动与输入的底层实现
开发语言·javascript·ecmascript
console.log('npc')19 小时前
vue2中子组件父组件的修改参数
开发语言·前端·javascript
码点19 小时前
【无标题】日文字库Japan.ini
开发语言
IT=>小脑虎19 小时前
2026版 Python零基础小白学习知识点【基础版详解】
开发语言·python·学习
wjs202420 小时前
抽象工厂模式
开发语言
lly20240620 小时前
SVG 模糊效果详解
开发语言
期待のcode20 小时前
Java虚拟机类加载机制
java·开发语言
看见繁华20 小时前
Linux 交叉编译实践笔记
linux·运维·笔记
Learner20 小时前
Python运算符
开发语言·python
一晌小贪欢20 小时前
Python 精确计算:告别浮点数陷阱,decimal 模块实战指南
开发语言·python·python入门·python3·python小数·python浮点数