2009-08-13 58 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