【问题标题】:sort a vector by alternating its values in R通过在 R 中交替其值来对向量进行排序
【发布时间】:2021-04-17 14:43:54
【问题描述】:

我有以下向量:

x <- c(1,1,2,2,3,3)

我希望通过交替的值对其进行排序,例如:

1,2,3,1,2,3

理想情况下,不必遍历元素并“手动”分配它们。

是否有一种优雅而通用的解决方案(或功能)来实现这种“交替排序”? 一般意义上的向量可以包含 1 到 n 个值(不仅是 1、2、3),并且某些“类别”可能比其他“类别”更频繁。

例如:

x <- c(1,1,1,2,2,2,3,3,4,4,4,4)

应该导致:

1,2,3,4,1,2,3,4,1,2,4,4

【问题讨论】:

    标签: r sorting


    【解决方案1】:

    创建一个分组变量 g 并按它和在 g 内按 x 排序:

    x <- c(1,1,1,2,2,2,3,3,4,4,4,4) # test input   
    g <- ave(x, x, FUN = seq_along)  # c(1, 2, 3, 1, 2, 3, 1, 2, 1, 2, 3, 4)
    x[order(g, x)]
    ## [1] 1 2 3 4 1 2 3 4 1 2 4 4
    
    x <- c(1,1,2,2,3,3)  # test input
    g <- ave(x, x, FUN = seq_along)  # c(1, 2, 1, 2, 1, 2)
    x[order(g, x)]
    ## [1] 1 2 3 1 2 3
    

    【讨论】:

      【解决方案2】:

      我们可以使用rowid

      library(data.table)
      x[order(rowid(x, x))]
      

      【讨论】:

        【解决方案3】:

        这是另一个使用 split 的基本 R 选项

        na.omit(
          c(
            t(
              list2DF(lapply(
                u <- split(x, x),
                `length<-`, max(lengths(u))
              ))
            )
          )
        )
        

        给了

         [1] 1 2 3 4 1 2 3 4 1 2 4 4
        attr(,"na.action")
        [1] 11 13 14 15
        attr(,"class")
        [1] "omit"
        

        【讨论】:

          【解决方案4】:

          要提取唯一值,请使用unique() 函数,然后使用rep() 函数尽可能频繁地重复序列。

          x <- unique(c(1,1,1,2,2,2,3,3,4,4,4,4))
          
          rep(x,4)
          

          结果

          [1] 1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4
          

          【讨论】:

          • 谢谢!当每个类别具有相同数量的元素时(即第一个“非一般”案例),这非常有用
          • 它也适用于您的一般情况,无论每个类别重复多少次。
          • 我认为这与预期的输出不同。
          猜你喜欢
          • 2011-05-16
          • 1970-01-01
          • 2019-11-06
          • 1970-01-01
          • 2016-12-15
          • 1970-01-01
          • 1970-01-01
          • 2019-03-02
          • 1970-01-01
          相关资源
          最近更新 更多