如何合并在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
相关产品推荐
相关产品推荐

