百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

单细胞测序分析之小技巧之for循环批量处理数据和出图

bigegpt 2024-08-05 11:51 8 浏览

“harmony”整合不同平台的单细胞数据之旅生物信息学习的正确姿势

NGS系列文章包括NGS基础、转录组分析 (Nature重磅综述|关于RNA-seq你想知道的全在这)、ChIP-seq分析 ChIP-seq基本分析流程、单细胞测序分析 (重磅综述:三万字长文读懂单细胞RNA测序分析的最佳实践教程 (原理、代码和评述))、DNA甲基化分析、重测序分析、GEO数据挖掘典型医学设计实验GEO数据分析 (step-by-step) - Limma差异分析、火山图、功能富集等内容。

在进行单细胞转录组测序分析中,我们发现比如样本较多或者需要大量出图的时候,我一开始就是大量手动一个一个的出图,但回头想想,这样的操作模式不都是一样的嘛,直接用for循环不就搞定啦!

基础

首先我们讲点for循环的基础知识及举个小栗子!

for循环基本结构如下:

for(变量 in 值){}

也就是说当变量在值的范围内将执行中括号内的操作。是不是非常简单?

我们举个栗子:

比如我们想要计算一个向量中偶数的个数:

x <- c(2,5,3,9,8,11,6)
count <- 0
for (val in x) {
if(val %% 2 == 0)  count = count+1
}
print(count)
[1] 3

在上面的示例中,由于向量x具有7个元素,因此循环迭代了7次。

在每次迭代中,val取x的对应元素的值。

我们使用了一个计数器来计算x中的偶数。我们可以看到x包含3个偶数。

进阶

比如我们现在有两个患者的鼻腔样本,然后我们进行单细胞测序后,cellranger后我们在filtered中分别生成了3个文件:barcodes,features和matrix。我懒呀,我想万一我有好多个样本怎么办,不如用一个for循环来搞定!

于是我的文件就成了这个样子:

batch_list=list("P2","P3")
batch_data_list=list("P2"=1,"P3"=1)
for( i in 1:length(batch_list))
{
  print(batch_list[[i]])
  s_object=Read10X(paste("~/Input_files/",batch_list[[i]],sep=""))
  s_object=CreateSeuratObject(counts =s_object, min.cells = 0, min.features = 400, project = "P23")
  s_object[["percent.mt"]] <- PercentageFeatureSet(s_object, pattern = "^MT-")
  s_object <- subset(s_object, subset = nFeature_RNA >100 & nFeature_RNA <8000 & percent.mt <10)
  s_object@meta.data[, "run"] <- batch_list[i]
  s_object=NormalizeData(s_object)
  batch_data_list[[i]]=FindVariableFeatures(s_object, selection.method = "vst", nfeatures =5000)
}

那么我们仔细看一下刚才发生了什么,我们首先把我们的“P2”和“P3”设置为list,然后在for循环中我们分别进行了读取数据,提取线粒体基因比例,QC筛选,在metadata中添加新的一列,进行归一化并计算高变基因。最后将P2和P3合并在一个list中。

这时候一定会有好同志问这样一个问题,为什么在batch_data_list=list(“P2”=1,”P3”=1)中将P2和P3都赋值为1,这时候我们不妨不对其进行设置,使batch_data_list=list(“P2”,”P3”),我们会看见下图中的P2会消失哦!


在我们使用seurat中的FindAllMarkers()得到每个cluster的高变基因后,我也同时得到了一个csv表,可是我觉得太不直观了,于是我现在要循环出一些不同clusters的vlnplot,我应该怎么办呢?嗨,循环起来呀!

clustersss <-
  list(
    "0",
    "1",
    "2",
    "3",
    "4",
    "5",
    "6",
    "7",
    "8",
    "9",
    "10",
    "11",
    "12",
    "13",
    "14",
    "15",
    "16",
    "17",
    "18",
    "19",
    "20",
    "21",
    "22"
  )
for (i in clustersss) {
  for (m in 1:nrow(run.combined.markers)) {
    if (run.combined.markers["cluster"][m, ] == i) {
      filename <- paste(run.combined.markers$gene[m], 'VlnPlot.pdf', sep = '_')
      p <-
        VlnPlot(object = run.combined,
                features = c(run.combined.markers$gene[m]))
      print(p)
      ggsave(p,
             filename = paste(i, run.combined.markers$gene[m], 'VlnPlot.pdf', sep = '_'))
      dev.off()
    }
  }
}

我给解释一下上面的内容,首先我们把我们的cluster设为list,i代表cluster,m代表run.combined.marker的排序,使用两个for循环进行嵌套,最后在保存文件时将cluster+基因名+vlnplot结合进行保存。


每次看见这样出图我都特别有成就感,,,,哈哈哈哈,快have a try!

其实也可以写一个apply版的,获得所有plotList,再用patchworkcowplot进行拼图。

plotMarker <- function(cluster, run.combined) {
  for (m in 1:nrow(run.combined.markers)) {
    if (run.combined.markers["cluster"][m,] == cluster) {
      filename <-
        paste(run.combined.markers$gene[m], 'VlnPlot.pdf', sep = '_')
      p <-
        VlnPlot(object = run.combined,
                features = c(run.combined.markers$gene[m]))
      ggsave(p,
             filename = paste(i, run.combined.markers$gene[m], 'VlnPlot.pdf', sep = '_'))
      return(p)
    }
  }
}
plotList = lapply(clustersss, plotMarker, run.combined = run.combined)
  • 这个Nature推荐的代码海洋竟然有文章作者上传的所有可重现性脚本,涉及单细胞、微生物组、转录组分析、机器学习等相关
  • 10X单细胞测序分析软件:Cell ranger,从拆库到定量
  • NBT|45种单细胞轨迹推断方法比较,110个实际数据集和229个合成数据集
  • 重磅综述:三万字长文读懂单细胞RNA测序分析的最佳实践教程 (原理、代码和评述)
  • “harmony”整合不同平台的单细胞数据之旅

相关推荐

Go语言泛型-泛型约束与实践(go1.7泛型)

来源:械说在Go语言中,Go泛型-泛型约束与实践部分主要探讨如何定义和使用泛型约束(Constraints),以及如何在实际开发中利用泛型进行更灵活的编程。以下是详细内容:一、什么是泛型约束?**泛型...

golang总结(golang实战教程)

基础部分Go语言有哪些优势?1简单易学:语法简洁,减少了代码的冗余。高效并发:内置强大的goroutine和channel,使并发编程更加高效且易于管理。内存管理:拥有自动垃圾回收机制,减少内...

Go 官宣:新版 Protobuf API(go pro版本)

原文作者:JoeTsai,DamienNeil和HerbieOng原文链接:https://blog.golang.org/a-new-go-api-for-protocol-buffer...

Golang开发的一些注意事项(一)(golang入门项目)

1.channel关闭后读的问题当channel关闭之后再去读取它,虽然不会引发panic,但会直接得到零值,而且ok的值为false。packagemainimport"...

golang 托盘菜单应用及打开系统默认浏览器

之前看到一个应用,用go语言编写,说是某某程序的windows图形化客户端,体验一下发现只是一个托盘,然后托盘菜单的控制面板功能直接打开本地浏览器访问程序启动的webserver网页完成gui相关功...

golang标准库每日一库之 io/ioutil

一、核心函数概览函数作用描述替代方案(Go1.16+)ioutil.ReadFile(filename)一次性读取整个文件内容(返回[]byte)os.ReadFileioutil.WriteFi...

文件类型更改器——GoLang 中的 CLI 工具

我是如何为一项琐碎的工作任务创建一个简单的工具的,你也可以上周我开始玩GoLang,它是一种由Google制作的类C编译语言,非常轻量和快速,事实上它经常在Techempower的基准测...

Go (Golang) 中的 Channels 简介(golang channel长度和容量)

这篇文章重点介绍Channels(通道)在Go中的工作方式,以及如何在代码中使用它们。在Go中,Channels是一种编程结构,它允许我们在代码的不同部分之间移动数据,通常来自不同的goro...

Golang引入泛型:Go将Interface「」替换为“Any”

现在Go将拥有泛型:Go将Interface{}替换为“Any”,这是一个类型别名:typeany=interface{}这会引入了泛型作好准备,实际上,带有泛型的Go1.18Beta...

一文带你看懂Golang最新特性(golang2.0特性)

作者:腾讯PCG代码委员会经过十余年的迭代,Go语言逐渐成为云计算时代主流的编程语言。下到云计算基础设施,上到微服务,越来越多的流行产品使用Go语言编写。可见其影响力已经非常强大。一、Go语言发展历史...

Go 每日一库之 java 转 go 遇到 Apollo?让 agollo 来平滑迁移

以下文章来源于GoOfficialBlog,作者GoOfficialBlogIntroductionagollo是Apollo的Golang客户端Apollo(阿波罗)是携程框架部门研...

Golang使用grpc详解(golang gcc)

gRPC是Google开源的一种高性能、跨语言的远程过程调用(RPC)框架,它使用ProtocolBuffers作为序列化工具,支持多种编程语言,如C++,Java,Python,Go等。gR...

Etcd服务注册与发现封装实现--golang

服务注册register.gopackageregisterimport("fmt""time"etcd3"github.com/cor...

Golang:将日志以Json格式输出到Kafka

在上一篇文章中我实现了一个支持Debug、Info、Error等多个级别的日志库,并将日志写到了磁盘文件中,代码比较简单,适合练手。有兴趣的可以通过这个链接前往:https://github.com/...

如何从 PHP 过渡到 Golang?(php转golang)

我是PHP开发者,转Go两个月了吧,记录一下使用Golang怎么一步步开发新项目。本着有坑填坑,有错改错的宗旨,从零开始,开始学习。因为我司没有专门的Golang大牛,所以我也只能一步步自己去...