第2章:物种丰度数据简介:OTU/ASV表结构,常见格式与元数据关联
好,咱们正式开始跟数据打交道。很多初学者拿到一份物种丰度数据后,第一反应就是「这表格该怎么看?」。别急,这章我就带你把这层窗户纸捅破。
所谓的物种丰度数据,说白了就是把测序仪吐出来的那些乱七八糟的序列,按物种归类,再数一数每个物种在样本里出现了多少次。最后你会得到一张大表——行是物种,列是样本,交叉点是数字。就这么简单。
核心概念:OTU(操作分类单元)和ASV(扩增子序列变体)是这张表的基础。OTU是按97%相似度聚类得到的,ASV是单碱基精度的去噪结果。我建议新手一开始别纠结两者谁更好,先搞清楚表结构才是正经事。
2.1 OTU/ASV表的行列结构
我们来拆解一下这张表的骨架。我把它分成三部分讲。
| 结构要素 | 说明 | 常见问题 |
|---|---|---|
| 行(Row) | 每个OTU/ASV的ID,例如OTU_1、ASV_120 | 行名必须唯一,千万别有重复 |
| 列(Column) | 样本名称,例如Sample1、Control_01 | 列名与元数据表要完全对应 |
| 值(Value) | 整数或浮点数,代表序列数或相对丰度 | 整型数据用整数,千万别乱转成小数 |
为什么要关注这个?嗯,因为我见过无数次因为行列名对不上,分析卡在半路的情况。举个例子,有一次一个师弟跑过来跟我说:「师兄,我的alpha多样性算不出来。」我一看,元数据里的样本名写成了「Sample_01」,丰度表里是「Sample1」,差一个下划线,全盘皆输。
2.2 常见格式:CSV、TSV与BIOM
你拿到的丰度表,通常有这三种格式。差别其实不大,就是个分隔符和封装方式的问题。
- CSV(逗号分隔值):最常见的格式,用英文逗号
,分隔。Excel直接打开很方便,但注意——如果物种分类名里含逗号,容易串列。 - TSV(制表符分隔值):用Tab键
\t分隔。我个人更偏爱TSV,因为逗号在名称里出现得更少,不容易翻车。 - BIOM(生物观测矩阵格式):JSON或HDF5格式的封装,自带分类信息。Qiime2的标配,结构复杂但功能强大。
这里给一段简单的读取代码,你感受一下区别。
# CSV格式读取
otu_csv <- read.csv("otu_table.csv", row.names = 1)
# TSV格式读取
otu_tsv <- read.table("otu_table.tsv", sep = "\t", header = TRUE, row.names = 1)
# BIOM格式读取(需要安装biomformat包)
library(biomformat)
otu_biom <- read_biom("otu_table.biom")
biom_to_dense(otu_biom)
2.3 元数据关联:把生物学背景装进来
光有丰度表是不够的。你想想看,没有分组信息,你怎么知道哪个样本是处理组、哪个是对照组?所以元数据表(metadata)必须跟上。
元数据表长这样:
| SampleID | Group | Time | Treatment |
|---|---|---|---|
| Sample_01 | Control | Day0 | PBS |
| Sample_02 | Treatment | Day7 | DrugA |
关联丰度表与元数据,核心就一句话:用样本名做桥梁。只要丰度表的列名和元数据表的SampleID列完全一致,merge就能搞定。
我曾经因为忽略大小写,栽过一次跟头。脚本跑了两周,结果发现丰度表里是「sample_01」,元数据里是「Sample_01」,一个字母大小写不同,all函数返回FALSE。从那以后,我写了个规范流程:
- 读取数据后立刻用
toupper()或tolower()统一大小写 - 用
setdiff()检查是否有缺失的样本 - 用
match()或merge()确保顺序一致
最后,我画了一张框架图,帮你把这章的知识点串起来。你看着这张图,应该能一目了然。
嗯,到这你应该清楚了。搞懂了表结构、认清了格式差异、把元数据挂上去,后头的分析才站得住脚。别小看这些基础操作,它们能帮你省下大把调试时间。