如何移除数据框中包含于其他序列的子序列行(含最小长度限制)
问题解决:移除DNA序列数据框中的子序列行
报错原因分析
你的代码报错有两个核心问题:
- dplyr管道语法错误:
group_by之后不能直接用原始数据框df做子集操作,管道内应该使用dplyr的函数(比如filter)来处理分组后的数据。 - 逻辑逻辑错误:
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
相关产品推荐
相关产品推荐

