【问题标题】:R: how to obtain alternating sequence of 1 and -1? [duplicate]R:如何获得1和-1的交替序列? [复制]
【发布时间】:2021-05-29 22:05:42
【问题描述】:

len = 3 表示序列的长度。如何编写一个接收len 并输出1 和-1 交替序列的函数?

对于示例,对于 len = 3,我希望函数返回 1 -1 1。如果len = 5,则1 -1 1 -1 1,以此类推。

【问题讨论】:

    标签: r


    【解决方案1】:

    您可以尝试rep 选项length.out

    > rep(c(1, -1), length.out = 5)
    [1]  1 -1  1 -1  1
    

    replace

    > replace(rep(1, 5), !(seq(5) %% 2), -1)
    [1]  1 -1  1 -1  1
    

    %%

    > 2 * seq(5) %% 2 - 1
    [1]  1 -1  1 -1  1
    

    【讨论】:

      【解决方案2】:

      一个选项是

      f1 <- function(len) {
               s1 <- seq_len(len)
               c(-1, 1)[(s1 %%2 == 1)+1]
         }
      f1(3)
      #[1]  1 -1  1
      f1(5)
      #[1]  1 -1  1 -1  1
      

      【讨论】:

      • 为什么不2*(s1 %%2)-1?这样你就不需要索引任何东西了。
      • @IRTFM 在另一篇文章中有类似的答案。所以,我想不要改变
      【解决方案3】:

      %%ifelse 也是一种可能性:

      n <- 10
      ifelse((1:n)%%2,1,-1)
      # [1]  1 -1  1 -1  1 -1  1 -1  1 -1
      

      但是效率不高:

      microbenchmark::microbenchmark(
        rep(c(1, -1), length.out = n),
        c(-1, 1)[((1:n)%%2 == 1)+1],
        ifelse((1:n)%%2,1,-1))
      
      Unit: nanoseconds
                                expr  min   lq mean median   uq   max neval
       rep(c(1, -1), length.out = n)  300  400  531    500  500  4100   100
       c(-1, 1)[((1:n)%%2 == 1) + 1] 1100 1200 1507   1300 1400 16700   100
             ifelse((1:n)%%2, 1, -1) 4100 4350 5053   4700 4950 37200   100
      

      【讨论】:

        【解决方案4】:

        n &gt; 1 的选项可以是:

        rep(1, 3) * c(1, -1)
        
        [1]  1 -1  1
        

        【讨论】:

          【解决方案5】:

          很简单:

          f <- function(num,len){
            num*(-1)**(0:len)
          }
          
          > f(1,5)
          [1]  1 -1  1 -1  1 -1
          > f(3,5)
          [1]  3 -3  3 -3  3 -3
          > f(-1,5)
          [1] -1  1 -1  1 -1  1
          

          这是非常有效的,同时它作为一个数字函数是有意义的。但是,效率最高的一个数量级是rep 方法,特别是当n 变大时。

          > n <- 10000
          > microbenchmark::microbenchmark(
          +   rep(c(1, -1), length.out = n),
          +   c(-1, 1)[((1:n)%%2 == 1)+1],
          +   ifelse((1:n)%%2,1,-1),
          +   (-1)**(0:n)
          + )
          Unit: microseconds
                                    expr     min       lq      mean   median       uq      max neval
           rep(c(1, -1), length.out = n)  14.358  14.8565  15.16934  15.1425  15.3390   18.651   100
           c(-1, 1)[((1:n)%%2 == 1) + 1] 238.995 240.0120 242.85757 240.7370 241.5830  312.495   100
                 ifelse((1:n)%%2, 1, -1) 311.653 314.0150 422.23417 315.2280 317.3465 5341.466   100
                              (-1)^(0:n) 211.948 212.6665 215.50381 213.2490 213.6770  339.639   100
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-06-09
            • 2022-12-01
            • 2011-01-16
            • 2022-12-13
            • 2016-08-29
            • 2012-06-08
            相关资源
            最近更新 更多