【问题标题】:Creating a (half-) regular sequence - a regular rate of varying intervals创建(半)规则序列 - 变化间隔的规则速率
【发布时间】:2016-03-14 00:20:33
【问题描述】:

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

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

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

我尝试过使用rep 和seq,但不知道如何将有规律变化的 间隔长度放入任一函数中。

我开始绘制它并考虑根据长度创建一个阶跃函数......这并不难 - 我不知道的技巧/魔术包是什么??

【问题讨论】:

    标签: r seq rep


    【解决方案1】:

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

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

    【讨论】:

    • 这很棒 - 简单且可扩展以供进一步使用。在adjustment 阶段,我的编程失败了——我知道这是我想做的,但不知道如何进入代码。非常感谢!
    • 我还需要输入na.trim,因为过度生成的值被保留为 NA 值。所以最后一步:x = na.trim(x[x
    • 我不知道你做了什么来介绍NAs,但不管对你有用。 (你可以看到我的输出,在运行我的确切代码后复制粘贴 - 没有na.trim,没有NAs。)
    【解决方案2】:

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

    【讨论】:

    • 已将固定的重复次数替换为可以得到大约 200 个序列的计算。
    【解决方案3】:

    我的第一次尝试是使用 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,因此上面的代码未经测试,但我希望你明白。

    【讨论】:

    • 这是我最后的手段,在我到达那里之前,你会设法发布!谢谢
    猜你喜欢
    • 2021-01-08
    • 2011-06-16
    • 2012-05-12
    • 1970-01-01
    • 2015-09-19
    • 1970-01-01
    • 2018-01-26
    • 2011-04-23
    • 2019-02-10
    相关资源
    最近更新 更多