在R语言中如何不重构矩阵转换矩阵内数据的类型?
如何在保留矩阵结构的前提下转换R矩阵的数据类型
假设你有一个6×4的逻辑型矩阵:
set.seed(4) mat <- matrix(sample(c(T, F), 24, replace = T), ncol = 4) mat # [,1] [,2] [,3] [,4] # [1,] FALSE TRUE FALSE FALSE # [2,] TRUE FALSE FALSE TRUE # [3,] TRUE TRUE FALSE TRUE # [4,] TRUE FALSE FALSE TRUE # [5,] TRUE TRUE FALSE TRUE # [6,] FALSE FALSE TRUE TRUE
当尝试将其转为整数型矩阵(FALSE对应0,TRUE对应1)时,直接调用as.integer()会把矩阵扁平化为一维向量,丢失原有的维度结构:
as.integer(mat) # [1] 0 1 1 1 1 0 1 0 1 0 1 0 0 0 0 0 0 1 0 1 1 1 1 1
虽然可以通过重构矩阵恢复结构,但这种写法不够简洁:
matrix(as.integer(mat), ncol = ncol(mat)) # [,1] [,2] [,3] [,4] # [1,] 0 1 0 0 # [2,] 1 0 0 1 # [3,] 1 1 0 1 # [4,] 1 0 0 1 # [5,] 1 1 0 1 # [6,] 0 0 1 1
更简洁的解决方案
以下几种方法可以直接修改矩阵类型,同时完整保留原矩阵的维度和结构:
1. 直接替换矩阵元素(最直观)
使用mat[]的方式赋值,能在不改变矩阵维度的前提下完成类型转换:
mat[] <- as.integer(mat) mat # [,1] [,2] [,3] [,4] # [1,] 0 1 0 0 # [2,] 1 0 0 1 # [3,] 1 1 0 1 # [4,] 1 0 0 1 # [5,] 1 1 0 1 # [6,] 0 0 1 1
2. 修改矩阵的存储模式
通过storage.mode()或mode()函数直接修改矩阵的底层存储类型,这种方式效率较高:
# 重新生成原矩阵(避免之前的修改影响) set.seed(4) mat <- matrix(sample(c(T, F), 24, replace = T), ncol = 4) storage.mode(mat) <- "integer" mat # 输出结果与上述方法一致
或者用mode():
mode(mat) <- "integer"
3. 使用as()进行类型转换(通用方法)
如果需要更通用的类型转换(比如转为其他矩阵类),可以用as()函数,若需要密集矩阵,可再转为普通矩阵:
set.seed(4) mat <- matrix(sample(c(T, F), 24, replace = T), ncol = 4) # 转为整数矩阵类 mat_int <- as(mat, "integerMatrix") # 转为普通密集矩阵 mat_int <- as.matrix(mat_int)
内容的提问来源于stack exchange,提问作者Dan Lewer
相关产品推荐
相关产品推荐

