gpt4 book ai didi

r - 在不丢失 dimnames 的情况下从稀疏矩阵转换为密集矩阵?

转载 作者:行者123 更新时间:2023-12-05 03:40:32 26 4
gpt4 key购买 nike

转换稀疏 Matrix对象(来自 Matrix 包)到一个普通的旧 base-R 密集型 matrix对象似乎丢失了行/列名称。

m <- matrix(0, 3,3, dimnames = list(LETTERS[1:3], LETTERS[1:3]))
dimnames(m)
## [[1]]
## [1] "A" "B" "C"
##
## [[2]]
## [1] "A" "B" "C"

转换为 Matrix很好:

dimnames(M <- Matrix::Matrix(m))
## [[1]]
## [1] "A" "B" "C"
## [[2]]
## [1] "A" "B" "C"

但转换回来似乎丢失了行/列名称:

dimnames(as.matrix(M))
## NULL
dimnames(as(M, "matrix"))
## NULL

我知道我可以通过存储 dimnames 然后将它们附加到新对象来解决它(见下文),但我不觉得我应该必须......我是否错过了一种透明/更好的方式进行转换的原因,或者为什么在进行此转换时应保留 dimnames 的逻辑原因??

## workaround/hack
dn <- dimnames(m)
m2 <- as.matrix(M)
dimnames(m2) <- dn

澄清一下,我想处理 M 的情况已存在已被定义但是m没有(即旧的 m[] <- 替换 m 的内容同时保持其属性不变的技巧似乎不起作用......)

最佳答案

[更新 1:bug report ][更新 2:patch ]

丢失[dD]imnames这似乎是 Matrix 中的错误, 至少在 "Matrix" 的具体子类的实现中有问题,即"ddiMatrix" (参见 ?`ddiMatrix-class`)。

library("Matrix")
M <- Matrix(0, 3L, 3L, dimnames = list(LETTERS[1:3], LETTERS[1:3]))
M
3 x 3 diagonal matrix of class "ddiMatrix"
A B C
A 0 . .
B . 0 .
C . . 0

有一种从"ddiMatrix"强制转换的方法至 "matrix" ,当你做的时候叫as(M, "matrix") , 但它不保留 [dD]imnames ,如您所见。

selectMethod("coerce", signature(from = "ddiMatrix", to = "matrix"))
Method Definition:

function (from, to = "matrix", strict = TRUE)
base::diag(if (from@diag == "U") as1(from@x) else from@x, nrow = from@Dim[1])
<bytecode: 0x11e7dc068>
<environment: namespace:Matrix>

Signatures:
from to
target "ddiMatrix" "matrix"
defined "ddiMatrix" "matrix"

您可以使用来自 "ddiMatrix" 的中间强制转换来解决该错误至 "dgCMatrix" ,这是一个更通用和更仔细实现的稀疏数字矩阵类(参见 ?`dgCMatrix-class` )。来自 "ddiMatrix" 的强制转换至 "dgCMatrix""matrix" 保留[dD]imnames :

MM <- as(M, "dgCMatrix")
MM
3 x 3 sparse Matrix of class "dgCMatrix"
A B C
A . . .
B . . .
C . . .
m <- as(MM, "matrix")
m
  A B C
A 0 0 0
B 0 0 0
C 0 0 0

或简单地 m <- as(as(M, "dgCMatrix"), "matrix") .

明确地说,您的方法既更透明。我介绍这个主要是为了揭露这个错误影响 "ddiMatrix" 的事实。但不是所有类别的稀疏数字矩阵都在 Matrix 中实现.如果您的用例实际上不需要 "ddiMatrix" , 那么你不一定需要担心保留 [dD]imnames自己。

FWIW,在与 Matrix 斗争时强制转换,我发现它有助于:

  1. 使用showClass("Matrix")提醒自己 "Matrix" 的继承结构子类。
  2. 咨询?`<classname>-class`用于 (1) 中报告的类及其位置的人类可读描述。
  3. 使用selectMethod("coerce", signature(from=, to=))找到as实际调用的方法(不过,由于强制转换通常在 C 中实现,因此 selectMethod 结果除了告诉我要在 Matrix/src 中搜索什么之外可能没有帮助)。

关于r - 在不丢失 dimnames 的情况下从稀疏矩阵转换为密集矩阵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68077229/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com