Я хотел бы извлечь все элементы из вектора x1
, где i-й столбец существует в разреженной матрице. Мне нужно удалить все разреженные элементы, но результаты должны жить построчно в своем собственном объекте / списке / матрице.
Дано:
> x1
[1] 1 2 3 4 5 6 7 8 9 10
> sparse_mat
8 x 10 sparse Matrix of class "ngCMatrix"
[1,] | | | . . . . . . .
[2,] . | | | . . . . . .
[3,] . . | | | . . . . .
[4,] . . . | | | . . . .
[5,] . . . . | | | . . .
[6,] . . . . . | | | . .
[7,] . . . . . . | | | .
[8,] . . . . . . . | | |
Желаемые результаты:
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 2 3 4
[3,] 3 4 5
[4,] 4 5 6
[5,] 5 6 7
[6,] 6 7 8
[7,] 7 8 9
[8,] 8 9 10
Более полный пример с комментарием
library(Matrix)
library(purrr)
x1 <- 1:10
create_seq_sparse <- function(n, len) {
bandSparse(m = n, n = n - len + 1L, k = seq_len(len) - 1L)
}
sparse_mat <- create_seq_sparse(10, 3)
sparse_mat
#> 8 x 10 sparse Matrix of class "ngCMatrix"
#>
#> [1,] | | | . . . . . . .
#> [2,] . | | | . . . . . .
#> [3,] . . | | | . . . . .
#> [4,] . . . | | | . . . .
#> [5,] . . . . | | | . . .
#> [6,] . . . . . | | | . .
#> [7,] . . . . . . | | | .
#> [8,] . . . . . . . | | |
# If there's a better way to do this, please advise?
mat_x1_mult_sparse <- t(t(sparse_mat) * x1)
mat_x1_mult_sparse
#> 8 x 10 sparse Matrix of class "dgCMatrix"
#>
#> [1,] 1 2 3 . . . . . . .
#> [2,] . 2 3 4 . . . . . .
#> [3,] . . 3 4 5 . . . . .
#> [4,] . . . 4 5 6 . . . .
#> [5,] . . . . 5 6 7 . . .
#> [6,] . . . . . 6 7 8 . .
#> [7,] . . . . . . 7 8 9 .
#> [8,] . . . . . . . 8 9 10
# This is nice, but can't use in conjunction with keep?
# mat_x1_mult_sparse[1, , drop = FALSE]
# Desired results, but this approach I think I lose the advantages of the sparse matrix?
mat_x1_mult_sparse[1, ] %>% keep(~ .x != 0)
#> [1] 1 2 3
mat_x1_mult_sparse[2, ] %>% keep(~ .x != 0)
#> [1] 2 3 4
# etc...
mat_x1_mult_sparse[8, ] %>% keep(~ .x != 0)
#> [1] 8 9 10