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

如何合并在2/3重复样本中出现的OTU?基于phyloseq的实现

解决方案:合并PCR重复并筛选类群

要实现合并重复样本reads,同时仅保留在3个重复中至少出现2次的类群,可以分步骤完成:先筛选符合条件的OTU/ESV,再合并重复样本。以下是具体实现代码:

步骤1:加载依赖包

library(phyloseq)
library(dplyr)
library(tidyr)

步骤2:按样本组筛选符合条件的类群

先统计每个类群在对应样本组的3个重复中,有多少个样本的reads大于0(即“出现”),筛选出出现次数≥2的类群:

# 将OTU表转换为长格式,结合样本信息
otu_long <- otu_table(df) %>%
  as.data.frame() %>%
  rownames_to_column("OTU") %>%
  pivot_longer(-OTU, names_to = "sample_id", values_to = "reads") %>%
  left_join(
    sample_data(df) %>% as.data.frame() %>% rownames_to_column("sample_id"),
    by = "sample_id"
  )

# 统计每个类群在每个样本组中的出现次数,筛选出至少出现2次的类群
qualified_otus <- otu_long %>%
  group_by(sample, OTU) %>%
  summarize(occurrence = sum(reads > 0), .groups = "drop") %>%
  filter(occurrence >= 2) %>%
  pull(OTU) %>%
  unique()

步骤3:过滤类群并合并重复样本

保留筛选后的类群,再用merge_samples合并同一样本的重复reads:

# 过滤phyloseq对象,仅保留符合条件的类群
df_pruned <- prune_taxa(qualified_otus, df)

# 合并同一样本的3个重复,求和reads
df_merged <- merge_samples(df_pruned, "sample", fun = sum)

补充:按样本组单独筛选后合并(可选)

如果需要严格保证每个样本组仅保留自己组内符合条件的类群(不同样本组的类群互不干扰),可以用以下代码:

# 按sample分组,获取每组的样本名
sample_groups <- sample_data(df) %>%
  as.data.frame() %>%
  group_by(sample) %>%
  summarize(sample_ids = list(rownames(.)), .groups = "drop")

# 定义函数:处理单个样本组的筛选与合并
process_group <- function(group_samples) {
  # 提取该组的OTU表,统计每个类群的出现次数
  group_otu <- otu_table(df)[, group_samples]
  keep_taxa <- names(which(rowSums(group_otu > 0) >= 2))
  
  # 过滤该组的类群与样本,再合并重复
  pruned_group <- prune_taxa(keep_taxa, prune_samples(group_samples, df))
  merge_samples(pruned_group, "sample", fun = sum)
}

# 处理所有样本组并合并结果
df_merged <- lapply(sample_groups$sample_ids, process_group) %>%
  do.call(merge_phyloseq, .)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 21:45:28