我将在整数向量上进行演示。为了简洁起见,我将不使用“90”和“45”,而是使用“14”和“7”(任意)。
vec <- 100 + 1:28
winsize <- 14
minsize <- 7
最后一个窗口应该开始于
laststart <- length(vec) - winsize + 1
laststart
# [1] 15
从这里,我们可以将其拆分为
starts <- 1 + (seq_len(ceiling(length(vec) / minsize)) - 1) * minsize
starts <- c(starts[starts < laststart], laststart)
Map(function(a, b) vec[a:b], starts, starts - 1 + winsize)
# [[1]]
# [1] 101 102 103 104 105 106 107 108 109 110 111 112 113 114
# [[2]]
# [1] 108 109 110 111 112 113 114 115 116 117 118 119 120 121
# [[3]]
# [1] 115 116 117 118 119 120 121 122 123 124 125 126 127 128
每个都是长度 14,最后一个结束于 vec 的最后一个元素。
如果数据不完全对齐,这仍然有效。
vec <- 100 + 1:40
winsize <- 14
minsize <- ceiling(winsize / 2)
laststart <- length(vec) - winsize + 1
starts <- 1 + (seq_len(ceiling(length(vec) / minsize)) - 1) * minsize
# the last window is at most minsize, we need it to be between minsize and winsize
starts <- c(starts[starts < laststart], laststart)
Map(function(a, b) vec[a:b], starts, starts - 1 + winsize)
# [[1]]
# [1] 101 102 103 104 105 106 107 108 109 110 111 112 113 114
# [[2]]
# [1] 108 109 110 111 112 113 114 115 116 117 118 119 120 121
# [[3]]
# [1] 115 116 117 118 119 120 121 122 123 124 125 126 127 128
# [[4]]
# [1] 122 123 124 125 126 127 128 129 130 131 132 133 134 135
# [[5]]
# [1] 127 128 129 130 131 132 133 134 135 136 137 138 139 140