Как отфильтровать гены от seuratobject в слоте @data?
Я работаю с пакетом R под названием "Seurat" для одноклеточного анализа RNA-Seq и пытаюсь удалить несколько генов в seuratobject (класс s4) из имени слота "data". В этом объекте также есть несколько слотов, в которых хранится информация, связанная со слотом "data". Слот "data" имеет имена Gene в строках и идентификаторы ячеек в столбцах со значениями выражения Genes, соответствующими каждой ячейке в матрице. Я хочу удалить всю строку на основе уникальных имен генов, но сохранить результат в объекте.
Пример:
Cell1 Cell2 Cell3
GeneA2 5 9 2
GeneA 3 1 0
GeneA1 2 1 3
Я хочу удалить строку GeneA в матрице.
Я пробовал следующее, но получаю ошибки:-
object<-SubsetRow(object@data, "GeneA", invert = TRUE)
а также
GeneA<-grep(pattern = "^GeneA$", x = rownames(x = object@data), value = TRUE)
object@data<- object@data[!GeneA,]
1 ответ
Давайте предположим, что вы работаете с чем-то похожим на объект данных pbmc_small, который загружен с пакетом Seurat. Посмотрите на пример на ?SubsetRow
страница справки:
# Installing the package:Seurat does install quite a few additonal packages
library(Seurat)
cd_genes <- SubsetRow(data = pbmc_small@raw.data, code = 'CD')
str(cd_genes)
#=================
Formal class 'dgTMatrix' [package "Matrix"] with 6 slots
..@ i : int [1:209] 0 5 6 9 5 8 9 10 15 5 ...
..@ j : int [1:209] 0 0 0 0 1 1 1 1 1 2 ...
..@ Dim : int [1:2] 16 80
..@ Dimnames:List of 2
.. ..$ : chr [1:16] "CD79B" "CD79A" "CD19" "CD180" ...
.. ..$ : chr [1:80] "ATGCCAGAACGACT" "CATGGCCTGTGCAT" "GAACCTGATGAACC" "TGACTGGATTCTCA" ...
..@ x : num [1:209] 1 4 1 2 4 2 2 1 1 4 ...
..@ factors : list()
#===========
rownames(x = cd_genes@data)
Ошибка в именах строк (x = cd_genes@data): для этого объекта класса "dgTMatrix" нет слота с именем "data"
Так что в этом объекте нет слота @data
Вместо этого просто используйте имена строк в cd_genes:
rownames(x = cd_genes)
[1] "CD79B" "CD79A" "CD19" "CD180" "CD200" "CD3D" "CD2" "CCDC104" "CD3E"
[10] "CD7" "CD8A" "CD14" "CD1C" "CD68" "CD9" "CD247"
Таким образом, это удаляет имя "CD200" из этого объекта:
> object<-SubsetRow(pbmc_small@raw.data, code="^CD200$", invert = TRUE)
> str(object)
Formal class 'dgTMatrix' [package "Matrix"] with 6 slots
..@ i : int [1:4453] 1 5 8 11 22 29 32 33 35 37 ...
..@ j : int [1:4453] 0 0 0 0 0 0 0 0 0 0 ...
..@ Dim : int [1:2] 229 80
..@ Dimnames:List of 2
.. ..$ : chr [1:229] "MS4A1" "CD79B" "CD79A" "HLA-DRA" ...
.. ..$ : chr [1:80] "ATGCCAGAACGACT" "CATGGCCTGTGCAT" "GAACCTGATGAACC" "TGACTGGATTCTCA" ...
..@ x : num [1:4453] 1 1 3 1 1 4 1 5 1 1 ...
..@ factors : list()
> "CD200" %in% rownames(object)
[1] FALSE
> "CD200" %in% rownames(pbmc_small@raw.data)
[1] TRUE
E сть data
слот в Seurat
-объекты, но как только вы извлекли его, больше нет data
-слот в этом объекте:
slotNames(pbmc_small)
[1] "raw.data" "data" "scale.data" "var.genes" "is.expr" "ident"
[7] "meta.data" "project.name" "dr" "assay" "hvg.info" "imputed"
[13] "cell.names" "cluster.tree" "snn" "calc.params" "kmeans" "spatial"
[19] "misc" "version"
slotNames(pbmc_small@data)
[1] "i" "p" "Dim" "Dimnames" "x" "factors"
Судя по комментарию, сообщение о проблеме не завершено. Если вопрос заключается в том, как изменить существующее значение слота, просто используйте @<-
как показано здесь:
pbmc_small2 <- pbmc_small
pbmc_small2@data <- SubsetRow(data = pbmc_small@data, code = 'CD')
Однако я не уверен, что это безопасно. Размеры @data
слот теперь отличается от размеров @raw.data
Слот и другие функции могут не совпадать, хотя я не знаю достаточно об этой структуре, чтобы быть уверенным. Безопасный способ использовать объекты S4 - это полагаться на функции, предоставляемые авторами пакетов, а не копаться в вещах низкого уровня, таких как слоты. Очевидно, что они хотели, чтобы вы могли использовать подмножество из разреженных матриц, но не хотят ли они, чтобы вы вернули их обратно в слоты.
Попробуйте команду ниже?
keep= c(!rownames(object) %in% c("GeneA"))
object <- subset(x = object,features =c(1:(dim(object)[1]))[keep])