【问题标题】:R Matrix package: Demean sparse matrixR Matrix 包:Demean 稀疏矩阵
【发布时间】:2017-05-08 05:42:37
【问题描述】:

是否有一种简单的方法可以按列贬低稀疏矩阵,同时将零值视为缺失(使用 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

附:希望发布一个由两个问题组成的问题不是问题。它们连接到相同的任务并且似乎反映了相同的问题 - 区分缺失的零值和实际的零值。

【问题讨论】:

  • 你确定你的最终矩阵是正确的,因为你似乎减去列意味着行明智。这可能有效scale(M, center=colSums(M) / diff(M@p), scale=FALSE)
  • @user20650 我更正了适当的代码以按列减去。我把sweep 函数放在那里以显示不起作用的解决方案。

标签: r sparse-matrix


【解决方案1】:

一种选择是将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

【讨论】:

  • 我只想补充一点,sweep(M, 2, colMeans(M*NA^!M, na.rm = TRUE))*NA^!M 是完整的解决方案,其中sweep 函数用于减法。
  • 和另一个使用稀疏矩阵结构的 alt。 colSums(M) / diff(M@p)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-13
  • 2013-11-29
  • 2013-06-26
  • 1970-01-01
  • 2018-01-19
  • 2012-09-04
  • 2013-11-29
相关资源
最近更新 更多