R矩阵包:Demean稀疏矩阵

时间:2017-05-06 19:19:05

标签: r sparse-matrix

是否有一种简单的方法可以按列贬低稀疏矩阵,同时将零值视为缺失(使用Matrix包)?

我似乎遇到了两个问题:

找到合适的列意味着

空单元格被认为是零而不是丢失:

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

P.S。希望发布由两个问题组成的问题不是问题。它们连接到同一个任务,似乎反映了同样的问题 - 区分缺失值和实际零值。

1 个答案:

答案 0 :(得分:3)

一种选择是将colSums除以非零逻辑矩阵的colSums

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

或者另一个选择是将{0}替换为NA,并使用colMeans参数获取na.rm = TRUE

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

或者@ user20650评论

colSums(M) / diff(M@p)
#[1] 2.500000 3.333333 2.333333 3.250000 3.500000

其中'p'是?sparseMatrix

中提到的指针
  

在典型用法中,p缺失,i和j是阳性的向量   整数和x是数字向量。这三个向量,必须   具有相同的长度,形成稀疏的三元组表示   矩阵。

     

如果缺少i或j,则p必须是非递减整数向量   其第一个元素是零。它提供压缩或“指针”   行或列索引的表示,以缺少的为准。该   扩展形式的p,rep(seq_along(dp),dp),其中使用dp&lt; -diff(p)   作为(基于1的)行或列索引。