计算稀疏矩阵每一列中两个值之间的元素数量

时间:2019-07-15 03:28:26

标签: r sparse-matrix

我有一个稀疏矩阵,如下所示

library(Matrix)

set.seed(2019)
nrows <- 10L
ncols <- 5L
vals <- sample(
  x = c(0,1,2,3),
  prob = c(0.7,0.1,0.1,0.1),
  size = nrows*ncols,
  replace = TRUE
)
mat <- matrix(vals,nrow=nrows)
matSparse <- as(mat,"sparseMatrix")

> matSparse
10 x 5 sparse Matrix of class "dgCMatrix"

 [1,] 2 2 . . .
 [2,] 2 . . . .
 [3,] . . 1 3 3
 [4,] . . . . .
 [5,] . . . . 3
 [6,] . . . . .
 [7,] 3 . . . 1
 [8,] . 2 1 . 1
 [9,] . . . . .
[10,] . . . 2 .

我想为每列计算落入某些值之间的元素数量(每列可能不同)。例如,我有一个向量(长度为ncolsbrks = c(1, 2, 1, 2, 2)。我想为j的每一列计算以下内容:

1)> 0(.)<=brks[j]的元素数量 2)>brks[j]的元素数。

在上面的示例中,结果将是1)0 2 2 1 2和2)3 0 0 1 2

我尝试创建类lgeMatrix的逻辑稀疏矩阵并应用colSums,但是没有成功。最后,由于我有非常大的矩阵(10000行和100000列),我想采用一种效率的方式

2 个答案:

答案 0 :(得分:3)

如果与相同尺寸的矩阵进行比较会怎样?

cmpr <- t(brks)[rep(1,nrow(matSparse)),]

colSums(matSparse > 0 & matSparse <= cmpr)
#[1] 0 2 2 1 2

colSums(matSparse > cmpr)
#[1] 3 0 0 1 2

甚至sweep

gt0ltB <- function(x,y) x > 0 & x <= y
gtB    <- function(x,y) x > y

colSums(sweep(matSparse, STATS=brks, MARGIN=2, FUN=gt0ltB))
#[1] 0 2 2 1 2
colSums(sweep(matSparse, STATS=brks, MARGIN=2, FUN=gtB))
#[1] 3 0 0 1 2

答案 1 :(得分:1)

我们可以使用sapply遍历每一列,然后brks

sapply(seq_len(ncol(matSparse)), function(i) 
                sum(matSparse[, i] > 0 & matSparse[, i] <= brks[i]))
#[1] 0 2 2 1 2

sapply(seq_len(ncol(matSparse)), function(i) sum(matSparse[, i] > brks[i]))
#[1] 3 0 0 1 2

由于在这两种情况下我们都在列上循环,所以我们也可以组合这两个条件并进行一次sapply调用

t(sapply(seq_len(ncol(matSparse)), function(i) 
       c(sum(matSparse[, i] > 0 & matSparse[, i] <= brks[i]), 
         sum(matSparse[, i] > brks[i]))))

#      [,1] [,2]
#[1,]    0    3
#[2,]    2    0
#[3,]    2    0
#[4,]    1    1
#[5,]    2    2

其中第一列是第一条件的输出,第二列是第二条件的输出。

相关问题