如何在R中基于字符比对筛选肽序列数据框,保留组内唯一有效序列?
R分组筛选唯一肽序列的实现方案
核心逻辑
按Description分组,每组内通过编辑距离(adist())识别相似序列(差异<6),将相似序列归为一类,每类仅保留character_count最大的条目;差异较大的序列全部保留。
实现步骤
1. 准备环境与示例数据
先加载依赖包,同时构造示例数据方便测试:
library(dplyr) library(igraph) # 构造测试数据框 set.seed(123) all_peptides <- tibble( Description = rep(c("Group1", "Group2"), each = 5), id = c("ABCDEFG", "ABCDEFA", "XYZHIJK", "XYZHJJK", "LMNOPQR", "AAAAAAA", "AAAAAAB", "BBBBBBB", "BBBBBBC", "CCCCCCC"), character_count = nchar(id) + sample(0:2, 10, replace = TRUE) )
2. 定义分组处理函数
编写函数处理单个分组内的序列筛选:
filter_unique_peptides <- function(group_df) { # 计算组内所有序列的两两编辑距离矩阵 dist_matrix <- adist(group_df$id) # 构建相似性邻接矩阵:距离<6则标记为相似(连通) adj_matrix <- ifelse(dist_matrix < 6, 1, 0) # 用图论连通分量划分相似序列组 graph <- graph_from_adjacency_matrix(adj_matrix, mode = "undirected", diag = FALSE) cluster_labels <- clusters(graph)$membership # 按聚类分组,保留每组character_count最大的条目 group_df %>% mutate(cluster = cluster_labels) %>% group_by(cluster) %>% filter(character_count == max(character_count)) %>% ungroup() %>% select(-cluster) }
3. 批量处理所有分组
用dplyr的分组操作将函数应用到整个数据框:
# 按Description分组处理,合并结果 filtered_peptides <- all_peptides %>% group_by(Description) %>% group_modify(~filter_unique_peptides(.x)) %>% ungroup()
关键说明
- 相似性判定:通过
adist()计算编辑距离,阈值<6可根据需求调整 - 聚类逻辑:用igraph的连通分量把间接相似的序列(比如A和B相似,B和C相似)归为同一类,避免遗漏
- 多最大值处理:如果同一聚类内有多个条目
character_count相同,会全部保留;若只需留一条,可在filter后添加slice(1)
内容的提问来源于stack exchange,提问作者Nina
相关产品推荐
相关产品推荐

