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

时间:2015-12-08 21:54:08

标签: r seq rep

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

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

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

我尝试过使用repseq,但不知道如何将经常变化的间隔长度变为任一函数。

我开始绘制它并考虑根据长度创建一个步长函数......它不是那么困难 - 我不知道的诀窍/魔法包是什么?

3 个答案:

答案 0 :(得分:4)

没有做任何数学计算,有多少组,我们可以过度生成。

定义术语,我会说你有一堆序列组,每组有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

答案 1 :(得分:4)

序列中连续值之间的差异由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

答案 2 :(得分:0)

我的第一次尝试是使用for循环,但请记住,与构建函数相比,它们很慢。但是,由于你只想“计数”到200,它应该足够快。

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

注意:在回答时我的计算机上没有Matlab,因此上面的代码未经测试,但我希望你明白这一点。