【发布时间】:2014-05-31 05:32:57
【问题描述】:
如何从维度名称列表创建稀疏矩阵?
假设您在数据框中有这个矩阵边缘列表:
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 包,它需要使用factors 的整数值:
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
感谢 Martin,您为我指明了这个方向。
【问题讨论】:
-
虽然与从 dimnames 重新构建标题不同,但您可以使用
xtabs从加权边缘列表中获取稀疏矩阵;xtabs(weight ~ from + to, data=foo, sparse=TRUE)
标签: r list matrix sparse-matrix