Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 计算稀疏矩阵每列中介于两个值之间的元素数_R_Sparse Matrix - Fatal编程技术网

R 计算稀疏矩阵每列中介于两个值之间的元素数

R 计算稀疏矩阵每列中介于两个值之间的元素数,r,sparse-matrix,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,"sparseMa

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

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 .
我想计算每一列的元素数量,在某些值之间,每一列的元素数量可能不同。例如,我有一个长度为ncols brks=c1,2,1,2,2的向量。我想为每列j计算以下内容:

1>0的元素数。和brks[j]

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

我曾尝试创建lgeMatrix类的逻辑稀疏矩阵并应用colSums,但都没有成功。最后,我希望有一个有效的方法来实现这一点,因为我有非常大的矩阵10000行100000列

我们可以使用sapply来迭代每一列和brk


其中第1列是第1个条件的输出,第2列是第2个条件的输出。

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

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

抱歉,在你发布答案之前我编辑了这篇文章。谢谢,我已经考虑过循环和应用函数系列,但是这对我的应用程序来说太慢了。我试图利用数据集的稀疏性。
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
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
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