我在 R 代码中有以下字符串。
aas <- "QAWDIIKRIDKK"
Run Code Online (Sandbox Code Playgroud)
我想检查包含以下向量中的字符的字符串的最长连续片段:
hydrophobic_res <- c("W", "F", "I", "L", "V", "M", "C", "A", "G")
Run Code Online (Sandbox Code Playgroud)
答案是:
AW, II
Run Code Online (Sandbox Code Playgroud)
其他例子:
QFILVMD -> FILVM
Run Code Online (Sandbox Code Playgroud)
我怎样才能在 R 中做到这一点?
一种选择 - 拆分字符串,将键向量中的不匹配元素替换为 NA,根据创建的数据进行分组paste
,NA
并根据max
字符的最大数量对元素进行子集化
f1 <- function(str1, matchvec)
{
v1 <- strsplit(str1, "")[[1]]
v1[!v1 %in% matchvec] <- NA
v2 <- tapply(v1, with(rle(!is.na(v1)),
rep(seq_along(values), lengths)),
FUN = function(x) paste(x[!is.na(x)], collapse = ""))
unname(v2[nchar(v2) == max(nchar(v2))])
}
Run Code Online (Sandbox Code Playgroud)
-测试
> f1(aas, hydrophobic_res)
[1] "AW" "II"
> f1("QFILVMD", hydrophobic_res)
[1] "FILVM"
Run Code Online (Sandbox Code Playgroud)
基于正则表达式的选项 - 创建模式以删除不在 matchvec 中的所有字符gsub
,根据字符数进行拆分和子集
f2 <- function(str1, matchvec)
{
pat <- sprintf("[^%s]", paste(matchvec, collapse = ""))
v1 <- strsplit(gsub(pat, ",", str1), ",")[[1]]
v1[nchar(v1) == max(nchar(v1))]
}
Run Code Online (Sandbox Code Playgroud)
-测试
> f2(aas, hydrophobic_res)
[1] "AW" "II"
> f2("QFILVMD", hydrophobic_res)
[1] "FILVM"
Run Code Online (Sandbox Code Playgroud)