根据子字符串的长度过滤一维字符向量

Posted

技术标签:

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

我有这个字符向量:

protein = "ARTKQTARKSTGGKAPRKQLATKAARKSAPATGGVKKPHRYRPGTVALREIRRYQKSTELLIRKLPFQRLVREIAQDFKTDLRFQSSAVMALQEACEAYLVGLFEDTNLCAIHAKRVTIMPKDIQLARRIRGERA"

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

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

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

    不要包含字母 K

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

    字符长度小于6的。

【问题讨论】:

您的预期结果是什么? 【参考方案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。 这工作得很好。 如果是,请考虑投票和/或接受答案。

以上是关于根据子字符串的长度过滤一维字符向量的主要内容,如果未能解决你的问题,请参考以下文章

使用精确子字符串过滤字符串

为啥 h5py 在向数据集添加 3 个可变长度字符串时会抛出错误?

数据结构与算法学习——动态规划-3

如何通过字符串的子集过滤数据框? [复制]

Manacher算法解决最长回文子串长度问题

shell变量子串