as.matrix
和 matrix
是 R 中用于处理矩阵的两个不同函数,它们有不同的用法和行为。
1.as.matrix
函数:
as.matrix
函数用于将一个对象转换为矩阵。如果对象已经是矩阵,则不会做任何改变。
它保持了原对象的结构,例如行名和列名,并且不会改变原有的行数和列数。
适用于将稀疏矩阵、数据框等转换为普通矩阵。
#举个例子
sparse_matrix <- Matrix::rsparsematrix(3, 3, 0.5)
dense_matrix <- as.matrix(sparse_matrix)
sparse_matrix
dense_matrix
matrix
函数:
matrix
函数用于创建一个新的矩阵。它接受数据向量并根据指定的行数和列数将其填充到矩阵中。
如果输入的数据向量没有明确指定行数和列数,matrix
会默认将向量作为单列填充,造成结果变成一列的情况。
它不会自动保持输入对象的行名和列名。
#示例:
data_vector <- 1:9
data_vector
matrix(data_vector, nrow = 3, ncol = 3)# 这样可以正确创建 3x3 矩阵
可以看到matrix()默认是按照列来进行填充的
具体的区别在于:
as.matrix
会保持输入对象的结构(例如行名和列名),并仅改变对象的类型。matrix
用于创建新的矩阵,并需要明确指定矩阵的维度(行数和列数)。如果没有明确指定维度,可能会导致结构发生变化。
因此,当你使用 matrix
时,如果没有指定维度信息,R 会将输入对象转换为一个列向量;而使用 as.matrix
时,R 会尽可能保持原对象的结构。
为了保持矩阵的行名和列名不变并正确转换,可以使用 as.matrix
函数,这样可以避免 matrix
函数可能引起的结构变化问题。
如果你想使用 matrix
函数将稀疏矩阵转换为普通矩阵并保持原来的行和列,可以先提取稀疏矩阵的数据和维度信息,然后使用这些信息来创建新的矩阵。
举个例子:
sparse_matrix <- a$RNA #假设这是一个稀疏矩阵
# 提取稀疏矩阵的数据,转换成一个向量的形式
#matrix 函数需要一个一维向量作为数据输入,而不是直接处理稀疏矩阵
data_vector <- as.vector(sparse_matrix)
# 提取行名和列名
row_names <- rownames(sparse_matrix)
col_names <- colnames(sparse_matrix)
# 获取行数和列数
nrow <- nrow(sparse_matrix)
ncol <- ncol(sparse_matrix)
# 使用 matrix 函数创建新的矩阵,byrow = TRUE指定按照行来填充,不指定的话默认按照列来填充矩阵
dense_matrix <- matrix(data_vector, nrow = nrow, ncol = ncol,byrow = TRUE)
# 重新设置行名和列名
rownames(dense_matrix) <- row_names
colnames(dense_matrix) <- col_names
# 检查转换后的矩阵
head(dense_matrix)