gpt4 book ai didi

r - 如何找到不包括 0 值的稀疏矩阵的列均值?

转载 作者:行者123 更新时间:2023-12-01 22:18:07 25 4
gpt4 key购买 nike

我有一个稀疏矩阵,其结构与此类似,但要大得多。

library(Matrix)
dfmtest<-new("dgCMatrix"
, i = c(0L, 1L, 2L, 4L, 5L, 6L, 8L, 0L, 1L, 2L, 3L, 4L, 6L, 7L, 8L,
0L, 2L, 3L, 6L, 7L, 8L, 1L, 2L, 4L, 5L, 6L, 7L, 8L, 9L, 0L, 1L,
3L, 4L, 5L, 6L, 7L, 8L, 9L, 0L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L,
9L, 0L, 1L, 3L, 4L, 6L, 7L, 8L, 9L, 0L, 2L, 3L, 5L, 6L, 7L, 9L,
0L, 1L, 2L, 3L, 4L, 5L, 6L, 8L, 9L, 0L, 1L, 2L, 3L, 4L, 5L, 6L,
7L, 9L)
, p = c(0L, 7L, 15L, 21L, 29L, 38L, 48L, 56L, 63L, 72L, 81L)
, Dim = c(10L, 10L)
, Dimnames = list(NULL, NULL)
, x = c(4, 3, 1, 2, 3, 1, 2, 1, 3, 3, 2, 3, 3, 3, 4, 2, 1, 2, 3, 2,
1, 4, 1, 2, 2, 3, 2, 3, 4, 1, 4, 1, 3, 4, 3, 2, 2, 2, 4, 1, 2,
2, 1, 2, 3, 1, 1, 1, 4, 1, 1, 2, 1, 1, 1, 4, 3, 3, 2, 1, 2, 2,
1, 1, 3, 3, 4, 1, 2, 4, 2, 4, 1, 2, 2, 3, 4, 2, 1, 2, 4)
, factors = list()
)

我希望能够找到每列(最终是行)的平均值,不包括 0 值。如果我尝试手动执行此操作,由于稀疏矩阵的大小,我会遇到内存问题。

nzmean <- function(x) {
mean(x[x!=0])
}


dfmmeans <- apply(dfmtest, 2, nzmean)
# 1 2 3 4 5 6 7 8
#2.285714 2.750000 1.833333 2.625000 2.444444 1.800000 1.875000 2.000000
# 9 10
#2.666667 2.333333

当我在实际矩阵上运行上述内容时,出现以下错误:

    Error in asMethod(object) : 
Cholmod error 'problem too large' at file ../Core/cholmod_dense.c, line 105

我还研究过使用 colMeans 函数,但它看起来好像在计算中包含了所有 0 值。

dfmmeans <- colMeans(dfmtest)
#[1] 1.6 2.2 1.1 2.1 2.2 1.8 1.5 1.4 2.4 2.1

有没有一个好的方法可以在大型稀疏矩阵上做到这一点?

最佳答案

Matrix 有一个很好的 summary 方法,它返回矩阵中非零元素的 i、j、x 数据框,可以使用 aggregate 轻松地对其进行汇总(或者 dplyr 或 data.table,如果您愿意的话):

library(Matrix)

str(summary(dfmtest))
#> Classes 'sparseSummary' and 'data.frame': 81 obs. of 3 variables:
#> $ i: int 1 2 3 5 6 7 9 1 2 3 ...
#> $ j: int 1 1 1 1 1 1 1 2 2 2 ...
#> $ x: num 4 3 1 2 3 1 2 1 3 3 ...
#> - attr(*, "header")= chr "10 x 10 sparse Matrix of class \"dgCMatrix\", with 81 entries"

aggregate(x ~ j, summary(dfmtest), mean)
#> j x
#> 1 1 2.285714
#> 2 2 2.750000
#> 3 3 1.833333
#> 4 4 2.625000
#> 5 5 2.444444
#> 6 6 1.800000
#> 7 7 1.875000
#> 8 8 2.000000
#> 9 9 2.666667
#> 10 10 2.333333

如果您想要纯矩阵运算版本,可以使用 abs(sign(...)) 将所有非稀疏元素转换为元素,这样您就可以仅计算列平均值与colSums:

colSums(dfmtest) / colSums(abs(sign(dfmtest)))
#> [1] 2.285714 2.750000 1.833333 2.625000 2.444444 1.800000 1.875000
#> [8] 2.000000 2.666667 2.333333

关于r - 如何找到不包括 0 值的稀疏矩阵的列均值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51467276/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com