R语言数据类型3:Matrices and arrays如何创建并访问?
1.如何创建
矩阵是一个二维数组,每个元素都拥有相同的模式(数值型、字符型或逻辑型)。
1.1 matrix()
matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE,dimnames = NULL)#从给定的值集中创建一个矩阵
as.matrix(x, ...)#尝试将其参数转换为矩阵
is.matrix(x)#用于测试其参数是否为(严格)矩阵
data一个可选的数据向量(包括列表或 表达式向量)。非原子类的 R 对象通过as.vector 进行转换,并丢弃所有属性。nrow所需行数ncol所需列数byrow逻辑值。如果FALSE(默认值),则按列填充矩阵,否则按行填充矩阵。dimnames矩阵的dimnames属性:NULL或一个长度为 2 的list,分别给出行名和列名。空列表被视为 NULL,长度为 1 的列表被视为仅包含行名。x一个 R 对象。
如果 nrow 或 ncol 中有一个未给出,将尝试根据 data 的长度和另一个参数推断它。如果两者都未给出,将返回一个单列矩阵。
如果 data 中的元素太少,无法填充矩阵,则 data 中的元素将被循环使用。如果 data 的长度为零,原子向量将使用适当类型的 NA(原始向量使用 0),列表将使用 NULL。
1.2示例
x <- matrix(1:10, nrow=2, ncol=5,byrow=TRUE)
x
| 1 | 2 | 3 | 4 | 5 |
| 6 | 7 | 8 | 9 | 10 |
1.3array()
array(data = NA, dim = length(data), dimnames = NULL)
as.array(x, ...)
is.array(x)
- data 一个向量(包括列表或 expression 向量)提供数据以填充数组。
- dim 要创建数组的 dim 属性,即一个长度为一或更多的整数向量,给出每个维度中的最大索引。
- dimnames 要么是 NULL,要么是维度的名称。这必须是一个列表(否则将被忽略),每个维度有一个组件,要么是 NULL,要么是一个长度由 dim 为该维度指定的字符向量。列表可以命名,并且列表名称将用作维度的名称。如果列表的维度数量少于维度的数量时,它将通过NULL 扩展到所需的长度。
- x 一个 R 对象。
1.4示例
# 创建2x3x2三维数组(2行,3列,2层)
arr3d <- array(1:12, dim = c(2, 3, 2))
print(arr3d)
, , 1
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
, , 2
[,1] [,2] [,3]
[1,] 7 9 11
[2,] 8 10 12
arr_named <- array(
1:12,
dim = c(2, 3, 2),
dimnames = list(
c("Row1", "Row2"), # 行名
c("Col1", "Col2", "Col3"), # 列名
c("LayerA", "LayerB") # 第三维名称
)
)
print(arr_named)
, , LayerA
Col1 Col2 Col3
Row1 1 3 5
Row2 2 4 6
, , LayerB
Col1 Col2 Col3
Row1 7 9 11
Row2 8 10 12
1.5 dim()获取或设置对象的维度
dim(x)
dim(x) <- value
- x 一个 R 对象。
- value 对于默认方法,可以是 NULL 或一个数值向量,该向量会被截断转换为整数。
1.6示例
x <- 1:24 ; dim(x) <- c(2,3,4)
print(x)
, , 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
2.如何访问
2.1矩阵元素访问
- 基本访问
mat <- matrix(1:6, nrow = 2, ncol = 3)
mat
# 访问第2行第3列
mat[2, 3]
# 访问第1行
mat[1, ]
# 访问第2列
mat[, 2]
- 多元素访问
# 访问第1行和第2行,第1列和第3列
mat[c(1,2), c(1,3)]
# 访问所有奇数行(假设有更多行)
mat[seq(1, nrow(mat), by=2), ]
- 使用逻辑索引
# 访问大于3的元素
mat[mat > 3] # 返回向量 c(4,5,6)
# 访问第2列大于3的行
mat[mat[,2] > 3, ] # 返回第2行
- 通过行列名称访问
rownames(mat) <- c("A", "B")
colnames(mat) <- c("X", "Y", "Z")
mat["A", "Y"] # 返回3
mat["B", c("X","Z")] # 返回c(2,6)
2.2数组(多维)的元素访问
- 基本访问
arr <- array(1:24, dim = c(2, 3, 4)) # 2行3列4层
# 访问第1层
arr[, , 1]
# [,1] [,2] [,3]
# [1,] 1 3 5
# [2,] 2 4 6
# 访问第2行第3列第4层
arr[2, 3, 4] # 返回24
# 访问所有层的第1行第2列
arr[1, 2, ] # 返回向量 c(3, 9, 15, 21)
- 子集访问
# 访问第2层和第3层的第1行
arr[1, , c(2,3)]
# [,1] [,2] [,3]
# [1,] 7 9 11
# [2,] 13 15 17
# 访问第1列的所有数据
arr[, 1, ]
# [,1] [,2] [,3] [,4]
# [1,] 1 7 13 19
# [2,] 2 8 14 20
- 使用名称访问
dimnames(arr) <- list(
c("R1","R2"),
c("C1","C2","C3"),
c("L1","L2","L3","L4")
)
arr["R1", "C2", "L3"] # 返回15
2.3修改值
mat[2,3] <- 100 # 修改单个元素
arr[,1,] <- 0 # 修改所有层的第一列
714

被折叠的 条评论
为什么被折叠?



