2015-12-08 7 views
2

Я хочу создать своего рода вложенную регулярную последовательность в R. Это следует за повторяющимся шаблоном, но без согласованных интервалов между значениями. Это:Создание (полу) регулярной последовательности - регулярная скорость с различными интервалами

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

Итак, 6 номеров с интервалом 1, затем интервал 3, а затем снова и снова. Я бы хотел, чтобы это было до 200, в идеале, возможность указать эту конечную точку.

Я попытался с помощью rep и seq, но не знаю, как получить регулярно изменяющийся интервал длины в в обе функции.

Я начал строить его и думал о создании функции шага, основанной на длине ... это не может быть так сложно - какой трюк/волшебный пакет я не знаю?

ответ

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 
+0

Thats great - простой и масштабируемый для дальнейшего использования. Это был этап «настройки», в котором мои программы были короткими - я знал, что это то, что я хотел сделать, но не знал, как войти в код. Большое спасибо! –

+0

Мне также нужно было забросить 'na.trim', поскольку надгенерированные значения остались в виде значений NA. Итак, последний шаг: x = na.trim (x [x <= 200]) –

+0

Я не уверен, что вы сделали, чтобы ввести 'NA', но все, что работает для вас. (Вы можете увидеть мой вывод, скопированный после запуска моего точного кода - no 'na.trim', no' NA's.) – Gregor

0

Моя первая попытка будет использоваться для циклов, но имейте в виду, что они медленны по сравнению с встроенными функциями. Но поскольку вы хотите «подсчитать» до 200, это должно быть достаточно быстро.

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

примечание: я не Matlab на моем компьютере во время ответа на, таким образом, приведенный выше код не тестировался, но я надеюсь, что вы получите эту идею.

+0

Это был мой последний курорт, который вы сидели, чтобы опубликовать, прежде чем я туда доберусь! Спасибо –

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 
+0

Сменили фиксированное количество реплик на расчет, который получит серию до 200 , –