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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 06:05:18