0

我根据一些基因将我的 seurat 对象分成 2 个对象,并对其进行分析,现在我想根据它们的原始细胞再次合并它们,但是当我合并它们时,条形码发生了变化,我有一个细胞的 2 个条形码不同索引。

对象1@meta.data:

                        orig.ident nCount_RNA nFeature_RNA
AAAGTCCTCCCTGGTT_1_1 SeuratProject        181           71
AACACACTCTAGATCG_1_1 SeuratProject        153           70
AATAGAGGTGACGCCT_1_1 SeuratProject        171           69
ACTCCCAAGAGGCTGT_1_1 SeuratProject         70           41
AGATCCAAGGGCGAAG_1_1 SeuratProject        224           85
AGGTCATCAGAACTCT_1_1 SeuratProject        758          192

object2@meta.data

                     orig.ident nCount_RNA nFeature_RNA 
AAAGTCCTCCCTGGTT_1_1   alive_14        231          158  
AACACACTCTAGATCG_1_1   alive_14        245          148  
AATAGAGGTGACGCCT_1_1   alive_14        275          179  
ACTCCCAAGAGGCTGT_1_1   alive_14        344          193  
AGATCCAAGGGCGAAG_1_1   alive_14        355          194  
AGGTCATCAGAACTCT_1_1   alive_14        397          245 

我正在寻找的结果:

                     orig.ident nCount_RNA nFeature_RNA 
AAAGTCCTCCCTGGTT_1_1   alive_14        412          229         
AACACACTCTAGATCG_1_1   alive_14        398          218         
AATAGAGGTGACGCCT_1_1   alive_14        446          248        
ACTCCCAAGAGGCTGT_1_1   alive_14        414          234         
AGATCCAAGGGCGAAG_1_1   alive_14        579          279         
AGGTCATCAGAACTCT_1_1   alive_14       1155          437  

但是我从合并数据中得到的结果是:merge(object1,object2)

                       orig.ident nCount_RNA nFeature_RNA 
AAAGTCCTCCCTGGTT_1_1_1   alive_14        231          158  
AACACACTCTAGATCG_1_1_1   alive_14        245          148  
AATAGAGGTGACGCCT_1_1_1   alive_14        275          179  
ACTCCCAAGAGGCTGT_1_1_1   alive_14        344          193  
AGATCCAAGGGCGAAG_1_1_1   alive_14        355          194  
AGGTCATCAGAACTCT_1_1_1   alive_14        397          245   
4

2 回答 2

0

问题是你需要在两个不同的数据集之间保留什么 Seurat 对象?对于数据槽(seurat[[assay]]@counts),您可以使用 rbind 将两个矩阵行绑定在一起。(请谨慎合并归一化值,如果这会违反任何假设)。

接下来对于降维和图形,您可以通过将降维或图形从一个对象拉到一个新的 Seurat 对象来将它们放入插槽中。

这是一些帮助的伪代码(我使用 V3,但如果您使用 V2,只需更改插槽名称)

merge_data <- rbind(object1[[assay]]@counts, object2[[assay]]@counts)
# repeat for other slots/assays (maybe write a function?)

metadata <- rbind(object1[[]], object2[[]])

seurat_merge <- CreateSeuratObject(counts = merge_data, meta.data = metadata)

# Place dim_reds
seurat_merge[["UMAP_object1"]] <- object1[["UMAP"]]
# repeat for more reductions (maybe write a function?)

一个更简单的解决方案可能只是重新导入数据,因为除非您将一个数据集投影到另一个数据集上,否则两个数据集之间的任何降维都无法比较。然后,您可以将两个分析中的任何相关元数据添加到新导入的对象中。

于 2021-08-04T17:40:11.580 回答
0

您可以使用tidyverse- 方法:

library(tibble)
library(dplyr)

bind_rows(rownames_to_column(object1), rownames_to_column(object2)) %>% 
  group_by(rowname) %>% 
  summarise(nCount_RNA = sum(nCount_RNA),
            nFeature_RNA = sum(nFeature_RNA)) %>% 
  mutate(orig.ident = "alive_14", .before = 2)

给你

# A tibble: 6 x 4
  rowname              orig.ident nCount_RNA nFeature_RNA
  <chr>                <chr>           <dbl>        <dbl>
1 AAAGTCCTCCCTGGTT_1_1 alive_14          412          229
2 AACACACTCTAGATCG_1_1 alive_14          398          218
3 AATAGAGGTGACGCCT_1_1 alive_14          446          248
4 ACTCCCAAGAGGCTGT_1_1 alive_14          414          234
5 AGATCCAAGGGCGAAG_1_1 alive_14          579          279
6 AGGTCATCAGAACTCT_1_1 alive_14         1155          437

数据

object1 <- structure(list(orig.ident = c("SeuratProject", "SeuratProject", 
"SeuratProject", "SeuratProject", "SeuratProject", "SeuratProject"
), nCount_RNA = c(181, 153, 171, 70, 224, 758), nFeature_RNA = c(71, 
70, 69, 41, 85, 192)), class = "data.frame", row.names = c("AAAGTCCTCCCTGGTT_1_1", 
"AACACACTCTAGATCG_1_1", "AATAGAGGTGACGCCT_1_1", "ACTCCCAAGAGGCTGT_1_1", 
"AGATCCAAGGGCGAAG_1_1", "AGGTCATCAGAACTCT_1_1"), spec = structure(list(
    cols = list(id = structure(list(), class = c("collector_character", 
    "collector")), orig.ident = structure(list(), class = c("collector_character", 
    "collector")), nCount_RNA = structure(list(), class = c("collector_double", 
    "collector")), nFeature_RNA = structure(list(), class = c("collector_double", 
    "collector"))), default = structure(list(), class = c("collector_guess", 
    "collector")), skip = 1L), class = "col_spec"))
object2 <- structure(list(orig.ident = c("alive_14", "alive_14", "alive_14", 
"alive_14", "alive_14", "alive_14"), nCount_RNA = c(231, 245, 
275, 344, 355, 397), nFeature_RNA = c(158, 148, 179, 193, 194, 
245)), problems = structure(list(row = 1:5, col = c(NA_character_, 
NA_character_, NA_character_, NA_character_, NA_character_), 
    expected = c("4 columns", "4 columns", "4 columns", "4 columns", 
    "4 columns"), actual = c("5 columns", "5 columns", "5 columns", 
    "5 columns", "5 columns"), file = c("literal data", "literal data", 
    "literal data", "literal data", "literal data")), row.names = c(NA, 
-5L), class = c("tbl_df", "tbl", "data.frame")), class = "data.frame", row.names = c("AAAGTCCTCCCTGGTT_1_1", 
"AACACACTCTAGATCG_1_1", "AATAGAGGTGACGCCT_1_1", "ACTCCCAAGAGGCTGT_1_1", 
"AGATCCAAGGGCGAAG_1_1", "AGGTCATCAGAACTCT_1_1"), spec = structure(list(
    cols = list(id = structure(list(), class = c("collector_character", 
    "collector")), orig.ident = structure(list(), class = c("collector_character", 
    "collector")), nCount_RNA = structure(list(), class = c("collector_double", 
    "collector")), nFeature_RNA = structure(list(), class = c("collector_double", 
    "collector"))), default = structure(list(), class = c("collector_guess", 
    "collector")), skip = 1L), class = "col_spec"))
于 2021-07-25T19:55:22.553 回答