【问题标题】:How can I create this special sequence?我怎样才能创建这个特殊的序列?
【发布时间】:2018-01-14 04:15:22
【问题描述】:

我想创建以下向量序列。

0 1 0 0 2 0 0 0 3 0 0 0 0 4

我的想法是先用rep() 创建0,但不知道如何添加1:4

【问题讨论】:

标签: r sequence seq rep


【解决方案1】:
# the sequence
s = 1:4

# create zeros vector
vec = rep(0, sum(s+1))

# assign the sequence to the corresponding position in the zeros vector
vec[cumsum(s+1)] <- s

vec
# [1] 0 1 0 0 2 0 0 0 3 0 0 0 0 4

或者更简洁,使用replace

replace(rep(0, sum(s+1)), cumsum(s+1), s)
# [1] 0 1 0 0 2 0 0 0 3 0 0 0 0 4

【讨论】:

    【解决方案2】:
    unlist(lapply(1:4, function(i) c(rep(0,i),i)))
    

    【讨论】:

      【解决方案3】:

      您可以使用rep() 创建一个序列,其中每个值都有n + 1

      n <- 4
      myseq <- rep(seq_len(n), seq_len(n) + 1)
      # [1] 1 1 2 2 2 3 3 3 3 4 4 4 4 4
      

      然后你可以使用diff() 找到你想要的元素。您需要将1 附加到diff() 输出的末尾,因为您总是需要最后一个值。

      c(diff(myseq), 1)
      # [1] 0 1 0 0 1 0 0 0 1 0 0 0 0 1
      

      那么你只需要将原始序列与diff() 输出相乘即可。

      myseq <- myseq * c(diff(myseq), 1)
      myseq
      # [1] 0 1 0 0 2 0 0 0 3 0 0 0 0 4
      

      【讨论】:

        【解决方案4】:

        创建一个对角矩阵,取上三角,去掉第一个元素:

        d <- diag(0:4)
        d[upper.tri(d, TRUE)][-1L]
        # [1] 0 1 0 0 2 0 0 0 3 0 0 0 0 4
        

        如果您更喜欢不进行全局分配的单行代码,请将其包装在一个函数中:

        (function() { d <- diag(0:4); d[upper.tri(d, TRUE)][-1L] })()
        # [1] 0 1 0 0 2 0 0 0 3 0 0 0 0 4
        

        出于代码高尔夫的目的,这是使用上面的d 的另一个变体:

        d[!lower.tri(d)][-1L]
        # [1] 0 1 0 0 2 0 0 0 3 0 0 0 0 4
        

        【讨论】:

          【解决方案5】:

          reprbind 使用他们的老把戏:

          rep(rbind(0,1:4),rbind(1:4,1))
          #[1] 0 1 0 0 2 0 0 0 3 0 0 0 0 4
          

          这实际上创建了 2 个矩阵,一个用于值,一个用于重复值的次数。 rep 不关心输入是否为矩阵,因为它只会将其展平为按顺序沿每一列向下的向量。

          rbind(0,1:4)
          #     [,1] [,2] [,3] [,4]
          #[1,]    0    0    0    0
          #[2,]    1    2    3    4
          
          rbind(1:4,1)
          #     [,1] [,2] [,3] [,4]
          #[1,]    1    2    3    4
          #[2,]    1    1    1    1
          

          【讨论】:

            猜你喜欢
            • 2017-08-11
            • 2011-04-27
            • 2017-07-06
            • 2022-10-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-07-10
            • 1970-01-01
            相关资源
            最近更新 更多