【问题标题】:filter 1D character vector according to length of substrings根据子字符串的长度过滤一维字符向量
【发布时间】:2022-01-03 16:32:04
【问题描述】:

我有这个字符向量:

protein = "ARTKQTARKSTGGKAPRKQLATKAARKSAPATGGVKKPHRYRPGTVALREIRRYQKSTELLIRKLPFQRLVREIAQDFKTDLRFQSSAVMALQEACEAYLVGLFEDTNLCAIHAKRVTIMPKDIQLARRIRGERA"

我想根据字母 R 的出现来分片。

peptide_fragments <- str_split(protein, "(?<=[R])")

现在从生成的片段中,我想省略以下子字符串:

  1. 不要包含字母 K

然后从剩余的子串中省略:

  1. 字符长度小于6的。

【问题讨论】:

  • 您的预期结果是什么?

标签: r string


【解决方案1】:

我们可以尝试使用纯 R 正则表达式方法:

protein <- "ARTKQTARKSTGGKAPRKQLATKAARKSAPATGGVKKPHRYRPGTVALREIRRYQKSTELLIRKLPFQRLVREIAQDFKTDLRFQSSAVMALQEACEAYLVGLFEDTNLCAIHAKRVTIMPKDIQLARRIRGERA"
parts <- strsplit(protein, "(?<=R)", perl=TRUE)[[1]]
output <- grep("^(?=.*K).{6,}$", parts, value=TRUE, perl=TRUE)
output

[1] "TKQTAR"                            "KSTGGKAPR"                        
[3] "KQLATKAAR"                         "KSAPATGGVKKPHR"                   
[5] "YQKSTELLIR"                        "KLPFQR"                           
[7] "EIAQDFKTDLR"                       "FQSSAVMALQEACEAYLVGLFEDTNLCAIHAKR"
[9] "VTIMPKDIQLAR"

【讨论】:

  • 这也完成了工作。谢谢!
【解决方案2】:

如果你想在 "R" 之后拆分:

temp <-  unlist(str_split(protein, "(?<=R)"))
res <- temp[grepl("K", temp) & !nchar(temp) < 6]

结果:

res
[1] "TKQTAR"                            "KSTGGKAPR"                        
[3] "KQLATKAAR"                         "KSAPATGGVKKPHR"                   
[5] "YQKSTELLIR"                        "KLPFQR"                           
[7] "EIAQDFKTDLR"                       "FQSSAVMALQEACEAYLVGLFEDTNLCAIHAKR"
[9] "VTIMPKDIQLAR" 

【讨论】:

  • IIRC OP 想要拒绝任何序列具有 K 或长度小于 6。
  • 这工作得很好。
  • 如果是,请考虑投票和/或接受答案。
猜你喜欢
  • 2013-11-25
  • 1970-01-01
  • 2019-02-04
  • 1970-01-01
  • 2018-09-28
  • 2021-10-03
  • 2012-01-19
  • 2012-12-06
相关资源
最近更新 更多