2009-08-13 27 views
11

在了解了options for working with sparse matrices in R之后,我想使用Matrix包从以下数据框创建稀疏矩阵,并让所有其他元素为NA使用NA默认条目创建(和访问)稀疏矩阵

 s r d 
1 1089 3772 1 
2 1109 190 1 
3 1109 2460 1 
4 1109 3071 2 
5 1109 3618 1 
6 1109 38 7 

我知道我可以创建具有以下稀疏矩阵,访问元素和往常一样:

> library(Matrix) 
> Y <- sparseMatrix(s,r,x=d) 
> Y[1089,3772] 
[1] 1 
> Y[1,1] 
[1] 0 

,但如果我想有默认值是NA,我试过如下:

M <- Matrix(NA,max(s),max(r),sparse=TRUE) 
    for (i in 1:nrow(X)) 
    M[s[i],r[i]] <- d[i] 

,并得到这个错误

Error in checkSlotAssignment(object, name, value) : 
    assignment of an object of class "numeric" is not valid for slot "x" in an object of class "lgCMatrix"; is(value, "logical") is not TRUE 

不仅如此,我发现需要更长时间才能访问元素。

> system.time(Y[3,3]) 
    user system elapsed 
    0.000 0.000 0.003 
> system.time(M[3,3]) 
    user system elapsed 
    0.660 0.032 0.995 

我应该如何创建这个矩阵?为什么一个矩阵慢得不能使用?

下面是上述数据的代码片段:

X <- structure(list(s = c(1089, 1109, 1109, 1109, 1109, 1109), r = c(3772, 
190, 2460, 3071, 3618, 38), d = c(1, 1, 1, 2, 1, 7)), .Names = c("s", 
"r", "d"), row.names = c(NA, 6L), class = "data.frame") 

回答

12

是的,亨利的答案肯定是真的,我可以为“矩阵”包的合着者说...

要你的另一个问题:为什么访问“M”比“Y”慢? 主要答案是,“M”比“Y”要稀疏得多,因此要小得多,并且 - 根据所用平台的尺寸和平台的RAM大小 - 对于小得多的对象,访问时间会更快,特别是对于索引他们。

+0

谢谢!我期待在StackOverflow上看到更多的答案。我会尽量鼓励我在使用Matrix时遇到的一些问题...... – 2009-08-24 17:10:42

+10

不幸的是,所有非零单元总是被存储。能够为sparseMatrix指定非零的默认值将会很好。 – Quantum7 2010-05-06 00:19:05

+1

我在想sparseMatrix是否有默认值? – hs3180 2014-04-26 08:04:13

15

你为什么要默认NA值?据我所知,矩阵只有零个单元时才是稀疏的。由于NA是非零值,因此您将丧失稀疏矩阵的所有优点。如果矩阵几乎不为零,则经典矩阵更加高效。经典的矩阵就像一个将根据尺寸切割的矢量。所以它只需要存储数据向量和维度。稀疏矩阵只存储非零值,但也存储那里的位置。当且仅当你有足够的零值时,这是一个优点。

+0

是的,我想这是事实。 – 2009-08-13 20:02:20

+1

但是,如果我的“默认”值是1,那么你肯定只有一个额外的信息要存储,即默认值是1而不是假设0.我仍然存储“与默认值不同”值,就像你在0例如,但前提是更一般。 – adunaic 2014-09-30 14:49:00

+1

“当且仅当你有足够的零值时,这是一个优点。”:简直不是真的。将您的评论中出现的每个“零”替换为“一个”或任何其他数字,您将看到您的句子仍然存在。使用零的事实只是惯例,并且有很多应用程序在其中有非零的默认值是有意义的。就节省内存而言,将默认值设置为数据集中最常出现的数字是有意义的。 – derwiwie 2016-08-09 14:08:33