Похоже, что 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]