【问题标题】:Sequentially reorganize a vector in R在R中顺序重组一个向量
【发布时间】:2013-03-27 20:54:20
【问题描述】:

我有一个数字元素z,如下所示:

> sort(z)
  [1]  1  5  5  5  6  6  7  7  7  7  7  9  9

我想按顺序重新组织这个元素,以便拥有

> z
  [1]  1  2  2  2  3  3  4  4  4  4  4  5  5  

我猜想将 z 转换为因子并将其用作索引应该是这种方式。

【问题讨论】:

    标签: r sorting vector


    【解决方案1】:

    你真的自己回答了:

    as.integer(factor(sort(z)))
    

    我知道这已被接受,但我决定查看factor() 内部,看看它是如何完成的。它或多或少归结为:

    x <- sort(z)
    match(x, unique(x))
    

    我想这是一条额外的线,但如果这很重要,它应该会更快。

    【讨论】:

      【解决方案2】:

      这应该可以解决问题

      z = sort(sample(1:10, 100, replace = TRUE))
      cumsum(diff(z)) + 1
       [1]  1  1  1  1  1  2  2  2  2  2  2  2  2  2  2  2  2  3  3  3  3  3  3  3  3
      [26]  3  3  4  4  4  4  4  4  4  4  5  5  5  5  5  5  5  5  5  5  5  6  6  6  6
      [51]  6  6  6  6  6  7  7  7  7  7  7  7  7  7  7  7  8  8  8  8  8  8  8  8  8
      [76]  8  8  8  8  8  9  9  9  9  9  9  9  9  9  9  9  9  9  9 10 10 10 10 10
      

      请注意,diff 省略了系列的第一个元素。所以要补偿:

      c(1, cumsum(diff(z)) + 1)
      

      【讨论】:

        【解决方案3】:

        替代使用rle:

        z = sort(sample(1:10, 100, replace = TRUE))
        rle_result = rle(sort(z))
        rep(rle_result$values, rle_result$lengths)
        
        > rep(rle_result$values, rle_result$lengths)
          [1]  1  1  1  1  1  1  2  2  2  2  2  2  2  2  2  2  2  2  3  3  3  3  3  3  3
         [26]  3  3  3  4  4  4  4  4  4  4  4  5  5  5  5  5  5  5  5  5  5  5  6  6  6
         [51]  6  6  6  6  6  6  7  7  7  7  7  7  7  7  7  7  7  8  8  8  8  8  8  8  8
         [76]  8  8  8  8  8  8  9  9  9  9  9  9  9  9  9  9  9  9  9  9 10 10 10 10 10
        

        【讨论】:

          【解决方案4】:
          rep(seq_along(rle(x)$l), rle(x)$l)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-02-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-04-07
            • 2019-11-23
            相关资源
            最近更新 更多