将S4对象存储在data.frame或data.table中
我试图将复杂的S4对象(使用Seurat软件包生成)放入data.table(我了解到不可能使用list或data.frame,但我没有发现关于data.table与S4对象兼容性的任何信息),这取决于它们的属性与函数的值。 这些对象都来自一个更大的对象,我在编写的函数中称之为dataset:将S4对象存储在data.frame或data.table中,r,data.table,iteration,embedding,s4,R,Data.table,Iteration,Embedding,S4,我试图将复杂的S4对象(使用Seurat软件包生成)放入data.table(我了解到不可能使用list或data.frame,但我没有发现关于data.table与S4对象兼容性的任何信息),这取决于它们的属性与函数的值。 这些对象都来自一个更大的对象,我在编写的函数中称之为dataset: subsets_by_cluster <- function(dataset){ nclust=data.table(cluster_ID=c(rep(NA,length(unique(data
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)}
首先,创建一个简单的S4类(摘自Hadley Wickham的) 正如@John Paul提到的,您可以创建一些并将它们存储在列表中
john <- new("Person", name = "John Smith", age = NA_real_)
jane <- new("Person", name = "Jane Smith", age = NA_integer_)
myPeeps <- list(john, jane)
由于data.frame
是一种特殊类型的list
,如上所述,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))
)
首先,创建一个简单的S4类(摘自Hadley Wickham的) 正如@John Paul提到的,您可以创建一些并将它们存储在列表中
john <- new("Person", name = "John Smith", age = NA_real_)
jane <- new("Person", name = "Jane Smith", age = NA_integer_)
myPeeps <- list(john, jane)
由于data.frame
是一种特殊类型的list
,如上所述,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))
)
您可以这样做:
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)
您可以这样做:
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)
我不知道Seurat packge,但你肯定可以列出S4对象的
列表。什么是数据集它是这些S4对象之一吗?还是其他原因?谢谢@JohnPaul,但我试过了,但也没有成功,给出了错误:>错误在[.Seurat
(数据集,dataset@active.ident==唯一(dataset@active.ident)[i] ):提供给子集单元格的逻辑值数量不正确当我手动尝试时,我得到错误:>S4对象的隐式列表嵌入已被弃用typeof(dataset)
给我“S4”作为输出,但如果您只是执行dataset@active.ident
你得到了什么?一个值、一个向量或其他什么?dataset@active.ident
给出了一个整数
,但它类似于5800个ID及其关联的集群。例如,dataset@active.ident[50]返回第50个单元格的ID(我在做生物信息学)及其相关集群的名称我不知道Seurat packge,但你当然可以制作一个S4对象的列表。什么是dataset
,它是这些S4对象中的一个吗?还是其他什么?谢谢@JohnPaul,但我试过了,但它也不起作用,给出了错误:>error in[.Seurat
(数据集,dataset@active.ident==唯一(dataset@active.ident)[i] ):提供给子集单元格的逻辑值数量不正确当我手动尝试时,我得到错误:>S4对象的隐式列表嵌入已弃用typeof(dataset)
给我“S4”作为输出,但如果您只是执行dataset@active.ident
你得到了什么?一个值、一个向量或其他什么?dataset@active.ident
给出了一个整数
,但它类似于5800个ID及其关联的集群。例如,dataset@active.ident[50]返回第50个单元格的ID(我在做生物信息学)及其相关集群的名称谢谢你的帮助。但我的问题是,首先我必须将我的大“数据集”文件拆分成几个(我不知道有多少个)较小的数据集,这取决于@active.ident的值。如果我手动分离每个子集(用两行,如`subset1=dataset[,dataset@active.ident==唯一(dataset@active.ident)[1] )。我可以有效地将它们存储在一个列表中(
list(subset1,subset2)`),但不能通过一个函数进行迭代,这正是我希望得到您帮助的地方。但我的问题是,我首先必须将我的大“数据集”文件拆分为几个(我不知道有多少个)较小的数据集,取决于@active.ident的值。如果我手动隔离每个子集(使用两行,如'subset1=dataset[,,dataset@active.ident==唯一(dataset@active.ident)[1] )。我可以有效地将它们存储在列表中(
list(subset1,subset2)`)但不是迭代地通过一个函数,这是我正在寻找的。非常感谢@StupidWolf,这正是我需要的!非常感谢@StupidWolf,这正是我需要的!
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>