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

如何移除数据框中包含于其他序列的子序列行(含最小长度限制)

问题解决:移除DNA序列数据框中的子序列行

报错原因分析

你的代码报错有两个核心问题:

  1. dplyr管道语法错误:group_by之后不能直接用原始数据框df做子集操作,管道内应该使用dplyr的函数(比如filter)来处理分组后的数据。
  2. 逻辑逻辑错误:grep(sequence[1:5], sequence)是硬编码取前5个序列当匹配模式,完全不符合“检查每个序列是否是同组内其他序列子序列”的需求。

正确解决方案

1. 构造测试数据(可跳过,用你自己的数据框即可)

df <- data.frame(
  Species = c(rep("Tilapia guineensis",4), rep("Sprattus sprattus",3), rep("Eutrigla gurnardus",3)),
  sequence = c("AAATGGA", "AAATGGAATA", "AAATGGAATAGAT", "TTATGGAGTAGA",
               "GTGCA", "GTGCAATGC", "GTGCAATGCA",
               "ACTGACTGATCG", "ACTGACT", "ACGAGTTTGCGAG"),
  size = c(7,10,13,12,5,9,10,12,7,13)
)

2. 核心处理代码

我们用dplyr分组,结合自定义函数检查每个序列是否是同组内其他序列的子序列,最终保留符合要求的行:

library(dplyr)
library(purrr)
library(stringr)

# 自定义函数:判断当前序列是否是同组内其他序列的子序列
is_subseq <- function(target_seq, all_seqs) {
  # 排除自身,检查剩余序列中是否存在包含target_seq的
  any(str_detect(setdiff(all_seqs, target_seq), target_seq))
}

# 分组筛选
cleaned_df <- df %>%
  group_by(Species) %>%
  filter(
    # 保留两种情况:序列长度<5,或者不是其他序列的子序列
    size < 5 | !map_lgl(sequence, is_subseq, all_seqs = sequence)
  ) %>%
  ungroup()

3. 结果验证

运行后得到的cleaned_df和你预期的处理结果完全一致:

# A tibble: 5 × 3
  Species           sequence       size
  <chr>             <chr>         <dbl>
1 Tilapia guineensis AAATGGAATAGAT    13
2 Tilapia guineensis TTATGGAGTAGA     12
3 Sprattus sprattus  GTGCAATGCA       10
4 Eutrigla gurnardus ACTGACTGATCG     12
5 Eutrigla gurnardus ACGAGTTTGCGAG    13

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 15:31:58