代码之家  ›  专栏  ›  技术社区  ›  Adrian

R:如何获得1和-1的交替序列?

r
  •  2
  • Adrian  · 技术社区  · 3 年前

    len = 3 表示序列的长度。我怎样才能写一个接受 len

    对于样品,对于 长度=3 ,我希望函数返回 1 -1 1 . 如果 len = 5 ,那么 1 -1 1 -1 1

    5 回复  |  直到 3 年前
        1
  •  6
  •   ThomasIsCoding    3 年前

    你可以试试 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
  •  3
  •   akrun    3 年前

    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
    
        3
  •  1
  •   Waldi    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
  •  1
  •   xaviescacs    3 年前

    很简单:

    f <- function(len){
      -(-1)**(1:len %% 2)
    }
    > f(5)
    [1]  1 -1  1 -1  1
    
        5
  •  0
  •   tmfmnk    3 年前

    n > 1 可以是:

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