Вам знакомо сжатое хранилище строк для разреженной матрицы? Индекс, который вы хотите, является просто ключевым компонентом в таком хранилище. Пакет R Matrix
имеет для этого свой класс "dgRMatrix".
library(Matrix)
spM <- as(sparse_matrix, "dgRMatrix")
## which row do those non-zero entries lie?
RowNumber <- rep(1:nrow(spM), diff(spM@p))
## position index of those entries on each row, i.e., column index
ColInd <- split(spM@j + 1, RowNumber)
## none-zero-element on each row
nze <- split(spM@x, RowNumber)
## expand position index by matrix value
mapply(rep, ColInd, nze)
#$`1`
#[1] 1 3 3 4
#$`2`
#[1] 4 4 4 4 4
Если матрица хранится как «dgCMatrix», можно ли ее преобразовать в «dgRMatrix»? В этом случае первая строка дает: нет метода или значения по умолчанию для приведения dgCMatrix к dgRMatrix
Это не метод принуждения от "dgCMatrix" к "dgRMatrix". sparse_matrix
такая же плотная матрица, как и в вашем посте. Таким образом, принуждение за этим as
от «матрицы» до «dgRMatrix».
Однако, если у вас уже есть это как "dgCMatrix", тогда вы можете сначала перенести его, а затем сделать что-то похожее на этом "dgCMatrix". Смотри ниже.
spM <- as(sparse_matrix, "dgCMatrix")
## transpose
spM <- t(spM)
## which column do those non-zero entries lie?
ColNumber <- rep(1:ncol(spM), diff(spM@p))
## position index of those entries on each column, i.e., row index
RowInd <- split(spM@i + 1, ColNumber)
## none-zero-element on each column
nze <- split(spM@x, ColNumber)
## expand position index by matrix value
mapply(rep, RowInd, nze)
#$`1`
#[1] 1 3 3 4
#$`2`
#[1] 4 4 4 4 4
Спасибо user20650 за его (большое) улучшение.
Для 1-го случая с "dgRMatrix",
spM <- as(sparse_matrix, "dgRMatrix")
RowNumber <- rep(1:nrow(spM), diff(spM@p))
split(rep(spM@j + 1, spM@x), rep(RowNumber, spM@x))
Для 2-го случая с "dgCMatrix"
spM <- as(sparse_matrix, "dgCMatrix")
ColInd <- rep(1:ncol(spM), diff(spM@p))
split(rep(ColInd, spM@x), rep(spM@i, spM@x))