创建一个(半)规则序列 - 变化间隔的规则速率

Creating a (half-) regular sequence - a regular rate of varying intervals

我想在 R 中创建一种嵌套的规则序列。它遵循重复模式,但值之间没有一致的间隔。它是:

8, 9, 10, 11, 12, 13, 17, 18, 19, 20, 21, 22, 26, 27, 28, ....

所以 6 个数字,间隔为 1,然后间隔为 3,然后再次相同。我希望一直到 200 左右,理想情况下能够指定该终点。

我尝试过使用 repseq,但不知道如何将 定期变化 间隔长度放入任一函数中。

我开始绘制它并考虑根据长度创建一个阶梯函数...它不会那么难 - 我不知道的 trick/magic 包是什么??

我的第一次尝试是使用 for 循环,但请记住,与内置函数相比,它们速度较慢。但是因为你只想 "count" 到 200,它应该足够快了。

for(i=1:199) {
    if( mod(i, 7) != 0) {
        result[i+1] = result[i] + 1;
    } else {
        result[i+1] = result[i] + 3;
    }
}

注意:回答时我的电脑上没有 Matlab,因此上面的代码未经测试,但我希望你能理解。

无需进行任何数学运算来计算出有多少组等,我们就可以过度生成。

定义术语,我会说你有一组序列,每组 6 个元素。我们将从 100 个小组开始,以确保我们一定 超过 200 个门槛。

n_per_group = 6
n_groups = 100

# first generate a regular sequence, with no adjustments
x = seq(from = 8, length.out = n_per_group * n_groups)

# then calculate an adjustment to add 
# as you say, the interval is 3 (well, 3 more than the usual 1)
adjustment = rep(0:(n_groups - 1), each = n_per_group) * 3

# if your prefer modular arithmetic, this is equivalent
# adjustment = (seq_along(x) %/% 6) * 3

# then we just add
x = x + adjustment

# and subset down to the desired result
x = x[x <= 200]

x
#  [1]   8   9  10  11  12  13  17  18  19  20  21  22  26  27  28  29  30
# [18]  31  35  36  37  38  39  40  44  45  46  47  48  49  53  54  55  56
# [35]  57  58  62  63  64  65  66  67  71  72  73  74  75  76  80  81  82
# [52]  83  84  85  89  90  91  92  93  94  98  99 100 101 102 103 107 108
# [69] 109 110 111 112 116 117 118 119 120 121 125 126 127 128 129 130 134
# [86] 135 136 137 138 139 143 144 145 146 147 148 152 153 154 155 156 157
#[103] 161 162 163 164 165 166 170 171 172 173 174 175 179 180 181 182 183
#[120] 184 188 189 190 191 192 193 197 198 199 200

序列中连续值之间的差异由 diffs 给出,因此取其中的 cumsum。要使其达到约 200,请使用指示的重复值,其中 1+1+1+1+1+4 = 9.

diffs <- c(8, rep(c(1, 1, 1, 1, 1, 4), (200-8)/9))
cumsum(diffs)

给予:

 [1]   8   9  10  11  12  13  17  18  19  20  21  22  26  27  28  29  30  31
 [19]  35  36  37  38  39  40  44  45  46  47  48  49  53  54  55  56  57  58
 [37]  62  63  64  65  66  67  71  72  73  74  75  76  80  81  82  83  84  85
 [55]  89  90  91  92  93  94  98  99 100 101 102 103 107 108 109 110 111 112
 [73] 116 117 118 119 120 121 125 126 127 128 129 130 134 135 136 137 138 139
 [91] 143 144 145 146 147 148 152 153 154 155 156 157 161 162 163 164 165 166
[109] 170 171 172 173 174 175 179 180 181 182 183 184 188 189 190 191 192 193
[127] 197