我有一个稀疏矩阵,如下所示
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 = 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
列),我想采用一种效率的方式
答案 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
其中第一列是第一条件的输出,第二列是第二条件的输出。