You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在phyloseq中快速查找含特定OTU/类群的样本?

高效定位phyloseq对象中包含目标类群的样本

下面提供几种直接、高效的方法,无需手动分步查找OTU和样本:

1. 按OTU编号查找对应样本

如果已知目标OTU的编号,直接筛选这些OTU的丰度数据,再提取有非零丰度的样本:

# 定义你的phyloseq对象和目标OTU列表
ps <- your_phyloseq_object
target_otus <- c("OTU_001", "OTU_005", "OTU_012")

# 筛选目标OTU的丰度矩阵并转置(样本×OTU格式)
otu_subset <- t(otu_table(ps)[target_otus, ])
# 提取至少含有一个目标OTU的样本名
samples_with_target <- rownames(otu_subset[rowSums(otu_subset) > 0, ])

2. 按分类名称查找对应样本

如果只知道类群的分类名称(比如属、种级别),先从tax_table中定位对应的OTU,再找样本:

# 示例:查找所有属于Lactobacillus属的OTU
target_otus_from_tax <- rownames(tax_table(ps)[tax_table(ps)[, "Genus"] == "Lactobacillus", ])

# 复用第一步的逻辑提取样本
otu_subset <- t(otu_table(ps)[target_otus_from_tax, ])
samples_with_target <- rownames(otu_subset[rowSums(otu_subset) > 0, ])

3. 用tidy格式简化操作(推荐)

借助psmelt()函数将phyloseq对象转为tidy数据框,用更直观的筛选逻辑获取结果:

# 转换为tidy数据框
ps_tidy <- psmelt(ps)

# 按分类名称筛选(示例:筛选含有Lactobacillus属且丰度>0的样本)
samples_with_target <- unique(ps_tidy$Sample[ps_tidy$Genus == "Lactobacillus" & ps_tidy$Abundance > 0])

# 按OTU编号筛选
samples_with_target <- unique(ps_tidy$Sample[ps_tidy$OTU %in% target_otus & ps_tidy$Abundance > 0])

4. 直接生成筛选后的phyloseq对象

如果需要后续分析,可直接得到仅包含目标类群和对应样本的phyloseq对象:

# 先筛选目标OTU,再去掉没有这些OTU的样本
ps_filtered <- prune_samples(
  sample_sums(prune_taxa(target_otus_from_tax, ps)) > 0,
  prune_taxa(target_otus_from_tax, ps)
)

内容的提问来源于stack exchange,提问作者sondre

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 16:50:24