【问题标题】:Store S4 objects in data.frame or data.table将 S4 对象存储在 data.frame 或 data.table 中
【发布时间】:2020-06-12 20:51:33
【问题描述】:

我正在尝试将复杂的 S4 对象(使用 Seurat 包生成)放入 data.table 中(我读到无法使用列表或data.frame,但我没有找到关于 data.table 与 S4 对象的兼容性的任何信息)取决于它们的属性的 值一个 与函数。 这些对象都来自一个更大的对象,我在我编写的函数中称为数据集:

 subsets_by_cluster <- function(dataset){
 nclust=data.table(cluster_ID=c(rep(NA,length(unique(dataset@active.ident)))))
 for (i in length(nclust)){
     nclust[i]=dataset[,dataset@active.ident==unique(dataset@active.ident)[i]] 
 }
 return(nclust)}

我期望得到一个 data.table 中充满了 S4 对象,其中 一列行数与不同 @active.ident 的数量一样多 strong> 值(集群 ID) 但是当我在原始数据集上运行它时,我得到了错误

[&lt;-.data.frame(*tmp*, i, 1, value = new("Seurat", assays = list( : 替换有 2965 行,数据有 1 行) 中的错误

我也试过用这种线手动做

nclust[1]=dataset[,dataset@active.ident==unique(dataset@active.ident)[1]]

但是也没用,提示错误:

类型“S4”不能强制转换为“逻辑”

将子集存储在变量中完美,但我希望我的脚本能够处理不同的簇编号。 我正在考虑编写要读取的文件,以便随后可以读取它们,但这似乎远非最佳解决方案。

你有什么建议吗?

【问题讨论】:

  • 我不知道 Seurat 包,但你当然可以制作一个 list 的 S4 对象。
  • dataset 是什么,它是这些 S4 对象之一吗?还是别的什么?
  • 谢谢@JohnPaul,但我试过了,但也没有用,出现错误:> [.Seurat(dataset, , dataset@active.ident == unique(dataset@active) 中的错误.ident)[i]) : 提供给子单元格的逻辑值的数量不正确 当我手动尝试时,我得到了错误:> 不推荐使用 S4 对象的隐式列表嵌入typeof(dataset) 给了我“S4”作为输出,但我没有不是自己创建的
  • 如果你只做dataset@active.ident 你会得到什么?单个值、向量还是其他?
  • dataset@active.ident 给出了 integer 但它就像 5800 个 ID 及其关联的集群。例如,dataset@active.ident[50] 返回第 50 个单元的 ID(我正在做生物信息学)及其关联集群的名称

标签: r data.table iteration embedding s4


【解决方案1】:

首先,创建一个简单的 S4 类(取自 Hadley Wickham 的 Advanced R

setClass("Person", 
  slots = c(
    name = "character",
    age = "numeric"
  )
)

正如@John Paul 提到的,您可以创建一些并将它们存储在列表中

john <- new("Person", name = "John Smith", age = NA_real_)
jane <- new("Person", name = "Jane Smith", age = NA_integer_)

myPeeps <- list(john, jane)

打印列表

> myPeeps
[[1]]
An object of class "Person"
Slot "name":
[1] "John Smith"

Slot "age":
[1] NA


[[2]]
An object of class "Person"
Slot "name":
[1] "Jane Smith"

Slot "age":
[1] NA

由于data.framelist 的一种特殊类型,并且正如我们在上面看到的list 元素可以是S4 对象,您也可以将它们存储在列中。你只需要使用I() 函数

size <- 5

propsToMyPeeps <- data.frame(
  propsFrom = I(sample(myPeeps, size, replace = TRUE)),
  propsValue = sample.int(10, size, replace = TRUE),
  propsTo = I(sample(myPeeps, size, replace = TRUE))
)

默认情况下,data.frameprint 方法不知道如何将我们的 Person 强制转换为字符串,因此打印 data.frame 会导致错误。但是,如果您对列进行子集化,则可以看到所有对象都在那里。

> print(propsToMyPeeps$propsTo)
[[1]]
An object of class "Person"
Slot "name":
[1] "Jane Smith"

Slot "age":
[1] NA


[[2]]
An object of class "Person"
Slot "name":
[1] "John Smith"

Slot "age":
[1] NA


[[3]]
An object of class "Person"
Slot "name":
[1] "John Smith"

Slot "age":
[1] NA


[[4]]
An object of class "Person"
Slot "name":
[1] "Jane Smith"

Slot "age":
[1] NA


[[5]]
An object of class "Person"
Slot "name":
[1] "Jane Smith"

Slot "age":
[1] NA

【讨论】:

  • 感谢您的帮助。但我的问题是,我首先必须将我的大“数据集”文件拆分为几个(我不知道有多少)较小的数据集,具体取决于@active.ident 的值。如果我手动隔离每个子集(有两行,如`subset1=dataset[,dataset@active.ident==unique(dataset@active.ident)[1]) . I can effectively store them in a list (list(subset1,subset2)`)但不是迭代通过一个函数,这就是我想要做的
【解决方案2】:

你可以这样做:

library(Seurat)
library(data.table)
data(pbmc_small)

nclust = data.table(cluster_ID=levels(Idents(pbmc_small)))
nclust$data = lapply(nclust$cluster_ID,function(i){
  pbmc_small[,Idents(pbmc_small)==i]
})

并且可以访问它们:

library(gridExtra)
grid.arrange(grobs=lapply(nclust$data,DimPlot),ncol=3)

   cluster_ID     data
1:          0 <Seurat>
2:          1 <Seurat>
3:          2 <Seurat>

代码中的错误首先将列定义为仅 NA,然后一次替换一个。而且,它应该是for(i in 1:nrow(nclust)) 而不是for(i in length(nclust))

如果您首先将其定义为 NA 列表,则可以:

subsets_by_cluster <- function(dataset){

 lvl = levels(Idents(dataset))
 nclust=data.table(
 cluster_ID = lvl,
 data=replicate(length(lvl),NA,simplify=FALSE)
 )
 for (i in 1:nrow(nclust)){
     nclust$data[[i]]=dataset[,Idents(dataset)==lvl[i]] 
 }
 return(nclust)}

subsets_by_cluster(pbmc_small)
   cluster_ID     data
1:          0 <Seurat>
2:          1 <Seurat>
3:          2 <Seurat>

【讨论】:

  • 非常感谢@StupidWolf,这正是我所需要的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-16
  • 1970-01-01
  • 1970-01-01
  • 2012-04-12
  • 2012-08-23
  • 2017-12-16
  • 1970-01-01
相关资源
最近更新 更多