我想在R中创建一种嵌套的常规序列。它遵循重复模式,但值之间没有一致的间隔。它是:
8, 9, 10, 11, 12, 13, 17, 18, 19, 20, 21, 22, 26, 27, 28, ....
所以6个数字的间隔为1,然后是3的间隔,然后再次相同。我希望这一直到200左右,理想情况下能够指定那个终点。
我尝试过使用rep
和seq
,但不知道如何将经常变化的间隔长度变为任一函数。
我开始绘制它并考虑根据长度创建一个步长函数......它不是那么困难 - 我不知道的诀窍/魔法包是什么?
答案 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,因此上面的代码未经测试,但我希望你明白这一点。