如何从维度名称列表中创建稀疏矩阵?
假设您在数据帧中有此矩阵边列表:
from to weight
1 4 a 1
2 5 b 2
3 6 c 3
可以这样创建:
from <- factor(c(4:6))
to <- c("a", "b", "c")
weight <- c(1:3)
foo <- data.frame(from, to, weight)
可以通过首先创建一个填充0的空矩阵,命名行和列,然后将值填充到以下方式来创建矩阵:
bar <- matrix(
0,
nrow = length(unique(foo$from)),
ncol = length(unique(foo$to)),
dimnames = list(levels(foo$from), levels(foo$to))
)
bar[as.matrix(foo[,1:2])] <- foo[,3]
结果看起来像这样:
a b c
4 1 0 0
5 0 2 0
6 0 0 3
如何创建稀疏矩阵?
解决方案
一种优雅的方法是使用Matrix程序包,该程序包需要使用factor的整数值:
bar_sparse <- sparseMatrix(
i = as.numeric(foo$from),
j = as.numeric(foo$to),
x = foo$weight,
dimnames = list(levels(foo$from), levels(foo$to))
)
开始了:
a b c
4 1 . .
5 . 2 .
6 . . 3
谢谢马丁,向我指出了这个方向。
作为Matrix
软件包的维护者:允许在构造中为sparseMatrix对象使用甚至在名称时都使用暗名,甚至对于重要的列名称也可以使用暗名,例如,对于稀疏模型矩阵(例如,glmnet
等等)。但是出于效率的原因(部分缺乏用例,因此“尚未实现”)它们并不总是在矩阵乘法中传播,例如IIRC。
这种“半劝阻”支持的主要原因是这样的事实:当从大的意义上讲非常大时,稀疏矩阵特别重要nrow(.) * ncol(.)
。在这种情况下,携带(和复制!!)成千上万的行(和列)名称会非常昂贵。
经过所有这些警告之后,我当然承认您已经提出了一个非常有效的问题,并且您可能暂时没有选择,并且确实需要使用行和列名称而不是整数索引。
是的,您(几乎)是正确的:使用
M <- Matrix(0, n,m, dimnames=....)
for(i in ...)
for(j in ...)
M[i,j] <- ...
是从来没有一个很好的点子sparseMatrix
对象(即所有Matrix对象继承sparseMatrix
)。相反,使用sparseMatrix(...., dimnames = ..)
..顺便指出使用dimnames
参数比设置colnames
和rownames
之后分别更有效。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句