【发布时间】:2019-06-14 02:25:31
【问题描述】:
有没有办法通过 rollapply/rollsum 在固定长度的窗口上计算 sparse 矩阵上的行和?为方便起见,我正在使用dgTMatrix,但我的问题并非特定于此类。例如,考虑生成一个8 x 10 稀疏矩阵。
library(Matrix)
i <- c(1,3:8); j <- c(2,9,6:10); x <- 7 * (1:7)
A <- sparseMatrix(i, j, x = x, giveCsparse = FALSE)
> A
8 x 10 sparse Matrix of class "dgTMatrix"
[1,] . 7 . . . . . . . .
[2,] . . . . . . . . . .
[3,] . . . . . . . . 14 .
[4,] . . . . . 21 . . . .
[5,] . . . . . . 28 . . .
[6,] . . . . . . . 35 . .
[7,] . . . . . . . . 42 .
[8,] . . . . . . . . . 49
在不首先强制转换为矩阵(例如 as.matrix())的情况下,一种天真的方法是使用 sapply 计算每个 window=2 列的行和,从而得到 8 x 5 密集强>矩阵。
window = 2
starts = seq(1,dim(A)[2],by=window)
A_rollsum <- sapply(starts, function(x) Matrix::rowSums(A[, x:(x+window-1)]))
> A_rollsum
[,1] [,2] [,3] [,4] [,5]
[1,] 7 0 0 0 0
[2,] 0 0 0 0 0
[3,] 0 0 0 0 14
[4,] 0 0 21 0 0
[5,] 0 0 0 28 0
[6,] 0 0 0 35 0
[7,] 0 0 0 0 42
[8,] 0 0 0 0 49
这对于大型稀疏矩阵效率不高。
【问题讨论】:
-
@G.Grothendieck - 有没有办法不将其强制为标准
matrix? -
矩阵与
A_rollsum不同。我已编辑问题以反映A和A_rollsum的外观。 -
您的
A_rollsum代码不起作用,因为未使用 by.column。我已将我的 cmets 移至一个答案,并表明两种计算结果的方法是相同的。 -
我并不是说最后两个
A_rollsum应该产生正确的矩阵。正确的输出是带有sapply的输出,但我想使用类似rollapply的输出。我将删除最后两个以避免混淆。 -
好的。我用密集而稀疏的答案对其进行了修改。
标签: r sparse-matrix rolling-computation