Вот еще 2 возможных подхода, предполагающих, что предоставляются только первые N-1 фиксированной ширины, а оставшиеся символы всегда свернуты в одну строку:
1) Использование base::substring
s <- "N27P3CAABCABBDC"
l <- c(2L,3L,2L,2L)
l <- c(l, nchar(s) - (sum(l) - length(l)) + 1L)
start <- c(1L, head(cumsum(l - 1L) + 1L, -1L))
stop <- cumsum(l - 1L)
paste(substring(s, start, stop), collapse=" ")
2) с использованием base::gsub
s <- "N27P3CAABCABBDC"
l <- c(2L,3L,2L,2L)
p <- paste(
lapply(c(l - 1L, nchar(s) - sum(l-1L)), function(n) sprintf("([[:alnum:]]{%d})", n)),
collapse="")
r <- paste(
paste0("\\", seq_len(length(l)+1L)),
collapse=" ")
gsub(p, r, s)
Пожалуйста, дайте мне знать, если это не удастся для крайних случаев.