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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:16:17