Ошибка: «аргумент к« который »не является логическим» для разреженной логической матрицы - PullRequest
1 голос
/ 02 марта 2020

Вот что я делаю:

  1. Загрузка разреженной матрицы из файла.
  2. Извлечение индексов (столбец, строка), которые имеют значения в этой разреженной матрице.
  3. Используйте эти индексы и значения для дальнейших вычислений.

Это прекрасно работает, когда я выполняю шаги в командной строке R. Но когда это делается внутри функции пакета, на шаге 2 выдается следующая ошибка :

Error in which(matA != 0, arr.ind = TRUE) :
  argument to 'which' is not logical

Вот пример кода с примером:

matA <- as(Matrix(c(0,1,2,1,0,0,3,0,2), nrow=3, ncol=3), "sparseMatrix")  # Step 1
nz <- which(matA != 0, arr.ind = TRUE)  # Step 2

> nz
     row col
[1,]   2   1
[2,]   3   1
[3,]   1   2
[4,]   1   3
[5,]   3   3

Загруженные матрицы в моем случае имеют тип: dsCMatrix, dgCMatrix.

class(matA != 0): lsCMatrix

Я не понимаю, почему это должно привести к ошибке.

Обратите внимание на следующее:

  1. Невозможно предоставить файл сброшенной разреженной матрицы. Отсюда показан пример создания фиктивной матрицы для шага 1.
  2. Размеры разреженной матрицы огромны. Поэтому преобразование разреженной матрицы в обычную матрицу превышает ограничение памяти.

Библиотеки : в пакете, который я использую, упоминаются следующие библиотеки:

Suggests: 
    testthat (>= 2.1.0),
    knitr,
    rmarkdown
Imports: 
    irlba,
    text2vec,
    dplyr,
    magrittr,
    Matrix,
    readr,
    rlang,
    data.table,
    stringr,
    here

1 Ответ

1 голос
/ 02 марта 2020

Вам необходимо загрузить библиотеку Matrix, скорее всего пакет не загружает ее. См. Пример ниже:

library(Seurat)
mat = pbmc_small@assays$RNA@counts
class(mat)
[1] "dgCMatrix"
attr(,"package")
[1] "Matrix"

which(mat>0)
Error in which(mat > 0) : argument to 'which' is not logical

library(Matrix)
head(which(mat>0,arr.ind=TRUE))
         row col
CD79B      2   1
HLA-DQB1   6   1
LTB        9   1
SP100     12   1
CXCR4     23   1
CD3D      31   1

Если Matrix уже загружен, это может быть Matrix ::, который каким-то образом маскируется. Вы можете сделать:

Matrix::which(mat>0)
...