我遇到类似于Find all possible substrings of length n的问题。但是,我不想使用字符来查找所有可能的子字符串,而是想使用下划线之类的定界符来分割单词。
例如:
"423.A_425.A_429.B_440.A_480.C_502.B"
由此,我想使用n=3
提取以下模式:
'423.A_425.A_429.B', '425.A_429.B_440.A', '429.B_440.A_480.C', '440.A_480.C_502.B'
使用n=4
,子字符串应变为:
'423.A_425.A_429.B_440.A', '425.A_429.B_440.A_480.C', '429.B_440.A_480.C_502.B'
我尝试调整Julius Vainora的解决方案(见下文),在下划线之间使用模式,而不是按字符分割,但是还没有运气:
allsubstr <- function(x, n) unique(substring(x, 1:(nchar(x) - n + 1), n:nchar(x)))
然后我得到输出(使用n=3
):
"423" "23." "3.A" ".A_" "A_4" "_42" "425" "25." "5.A" "429" "29." "9.B" ".B_" "B_4" "_44" "440" "40." "0.A" "_48" "480" "80." "0.C" ".C_" "C_5" "_50" "502" "02." "2.B"
什么可以替代?
答案 0 :(得分:1)
我们可以在split
处_
,然后使用combn
查找所有可能的子字符串,然后找到paste
combn(unlist(strsplit(v1, "_")), 3, FUN = paste, collapse="_")
答案 1 :(得分:0)
OP似乎只希望组合具有与原始字符串中出现的顺序相同的组合。
v <- "423.A_425.A_429.B_440.A_480.C_502.B"
allsubstr <- function(string, size, delim) {
vec_string <- unlist(strsplit(string, delim))
if(size < 1 || size > length(vec_string))
stop("size must be element of [1, ", length(vec_string), "]")
if(size == 1)
return(vec_string)
idxs <- cbind(start = size:length(vec_string) - size + 1,
end = size:length(vec_string))
mx <- apply(idxs, 1, function(i, s, d) s[c(i["start"]:i["end"])], s = vec_string, d = delim)
apply(mx, 2, paste, collapse = delim)
}
然后我们可以做:
> allsubstr(v, 0, "_")
Error in allsubstr(v, 0, "_") : size must be element of [1, 6]
> allsubstr(v, 3, "_")
[1] "423.A_425.A_429.B" "425.A_429.B_440.A" "429.B_440.A_480.C" "440.A_480.C_502.B"
> allsubstr(v, 4, "_")
[1] "423.A_425.A_429.B_440.A" "425.A_429.B_440.A_480.C" "429.B_440.A_480.C_502.B"
> allsubstr(v, 7, "_")
Error in allsubstr(v, 7, "_") : size must be element of [1, 6]