2017-05-06 237 views
3

有沒有一種簡單的方法來減少列的稀疏矩陣,同時考慮零值丟失(使用矩陣包)?R矩陣包:Demean稀疏矩陣

似乎有是兩個問題,我掙扎:

尋找適當的立柱意味着

空細胞被認爲是零,而不是丟失:

M0 <- matrix(rep(1:5,4),nrow = 4) 
M0[2,2] <- M0[2,3] <- 0 
M <- as(M0, "sparseMatrix") 
M 
#[1,] 1 5 4 3 2 
#[2,] 2 . . 4 3 
#[3,] 3 2 1 5 4 
#[4,] 4 3 2 1 5 
colMeans(M) 
#[1] 2.50 2.50 1.75 3.25 3.50 

正確的結果應該是:

colMeans_correct <- colSums(M)/c(4,3,3,4,4) 
colMeans_correct 
#[1] 2.500000 3.333333 2.333333 3.250000 3.500000 

減列是什麼意思

減法也進行對失蹤細胞:

sweep(M, 2, colMeans_correct) 
#4 x 5 Matrix of class "dgeMatrix" 
#  [,1]  [,2]  [,3] [,4] [,5] 
#[1,] -1.5 1.6666667 1.6666667 -0.25 -1.5 
#[2,] -0.5 -3.3333333 -2.3333333 0.75 -0.5 
#[3,] 0.5 -1.3333333 -1.3333333 1.75 0.5 
#[4,] 1.5 -0.3333333 -0.3333333 -2.25 1.5 

附:希望發佈由兩個問題組成的問題不是問題。他們連接到同一個任務,似乎反映了同樣的問題 - 區分丟失的和實際的零值。

+1

你確定你的最終矩陣是正確的,因爲你似乎減去列意味着行明智。這可能工作'比例(M,center = colSums(M)/ diff(M @ p),scale = FALSE)' – user20650

+0

@ user20650我更正了適當的代碼以明智地減列。我在那裏提供了「掃描」功能,以顯示無法正常工作的解決方案。 – Pepacz

回答

3

一種選擇是由非零邏輯矩陣

colSums(M)/colSums(M!=0) 
#[1] 2.500000 3.333333 2.333333 3.250000 3.500000 

或其他選項的colSums來劃分colSums是0與NA更換並獲得colMeansna.rm = TRUE參數

colMeans(M*NA^!M, na.rm = TRUE) 
#[1] 2.500000 3.333333 2.333333 3.250000 3.500000 

或者@ user20650評論了

colSums(M)/diff([email protected]) 
#[1] 2.500000 3.333333 2.333333 3.250000 3.500000 

其中「P」是在?sparseMatrix

在典型的使用中提到的指針,對缺失,i和j爲正整數 的矢量,並且x是數值向量。這三個向量必須具有相同的長度,形成稀疏矩陣的三元組表示。

如果i或j不存在,那麼p必須是非遞減整數向量 ,其第一個元素爲零。它提供行或列索引的壓縮或「指針」表示,無論哪個丟失。擴展形式的p,rep(seq_along(dp),dp)其中dp < -diff(p)被用作 作爲基於(1)的行或列索引。

+1

我只是想補充一下'掃描(M,2,colMeans(M * NA ^!M,na.rm = TRUE))* NA ^!M'是完整的解決方案,其中'sweep'函數用於減法。 – Pepacz

+2

和另一種使用稀疏矩陣結構的alt。'colSums(M)/ diff(M @ p)' – user20650