R语言筛选肽序列列中无内部R/K的行的方法求助
解决肽序列过滤问题:保留内部不含R/K的行
嗨,Moe!我明白你想要过滤数据框,只保留那些肽序列中间位置(非首尾)没有R或K的行。这里有两种简单的方法可以实现,都用你熟悉的dplyr和stringr包:
方法一:提取中间部分检查(直观易懂)
这个方法思路很直接:先把每个肽序列的首尾字符去掉,得到中间部分,然后检查中间部分里有没有R或K,只保留中间没有的行。
library(dplyr) library(stringr) # 你的示例数据框 df1 <- data.frame( Peptide = c("ABCOIIJUHFSAUJHR", "AOFIAUKOAISDFUK", 'ASOIRDFHAOHFKK')) # 过滤操作 filtered_df <- df1 %>% # 提取从第2个到倒数第2个字符的中间部分 mutate(middle_seq = str_sub(Peptide, start = 2, end = -2)) %>% # 过滤掉中间部分包含R或K的行(negate=TRUE表示取反) filter(str_detect(middle_seq, "[RK]", negate = TRUE)) %>% # 删掉临时的中间列(可选,如果你不需要的话) select(-middle_seq) # 查看结果 filtered_df
运行后你会得到预期的结果:只有第一行被保留。
方法二:用正则表达式直接匹配(更简洁)
如果你喜欢用正则一步到位,可以用负向前瞻来确保字符串里没有出现在中间位置的R/K:
filtered_df <- df1 %>% filter(str_detect(Peptide, "^(?!.*(?<!^)[RK](?!$)).*$"))
正则表达式解释:
^和$分别匹配字符串的开头和结尾(?!...)是负向前瞻,表示后面的内容不能匹配括号里的规则(?<!^)[RK](?!$)匹配的是:既不在开头((?<!^))也不在结尾((?!$))的R或K- 整个正则的意思就是:字符串中不存在任何位于中间位置的R或K
两种方法都能达到你的需求,第一种更适合新手理解,第二种更简洁。你可以根据自己的习惯选择~
内容的提问来源于stack exchange,提问作者Moe
相关产品推荐
相关产品推荐

