R语言学习笔记5-数据结构-多维数组
- 多维数组(array)介绍
- 特点和用途
- 创建多维数组
- 多维数组的索引和切片
- 多维数组的运算
- 获取多维数组的维度和属性
- 多维数组的合并和拆分
- 多维数组的逻辑操作
- 多维数组的转置和重塑
- 多维数组的元素操作
- 多维数组的统计函数
- 多维数组的循环操作
- 使用reshape2包的melt()和dcast()函数
- 利用purrr包对多维数组进行函数应用
- 对多维数组进行条件筛选和替换
- 多维数组的子集选择
- 使用data.table包对多维数组进行高效操作
- 使用tidyverse进行多维数组的处理
多维数组(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)