Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将S4对象存储在data.frame或data.table中_R_Data.table_Iteration_Embedding_S4 - Fatal编程技术网

将S4对象存储在data.frame或data.table中

将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

我试图将复杂的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(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>