如何在dplyr中以递增的顺序排列降序甚至偶数的奇数

时间:2017-08-10 12:58:30

标签: r

我在r

中有以下数据框
   ID     bay    row     number     
   1      43      11       ABC
   2      43      6        DEF
   3      43      13       QWE
   4      43      15       XDF
   5      43      4        VGH
   6      43      2        TYU
   7      11      11       QAS
   8      11      13       QTO
   9      11      12       EWQ
   10     11      10       RFT  

我希望按bay

按递增顺序排列降序甚至偶数的奇数

我想要的数据框将会跟随

  ID     bay     row     number     
  1       43      15      XDF
  2       43      13      QWE
  3       43      11      ABC
  4       43      2       TYU
  5       43      4       VGH
  6       43      6       DEF
  7       11      13      QTO 
  8       11      11      QAS
  9       11      10      RFT 
 10       11      12      EWQ   

我怎么能在dplyr中这样做?

3 个答案:

答案 0 :(得分:2)

对于base解决方案,请按row是奇数还是偶数来拆分数据,然后使用mapply对它们进行单独排序。

df <- 
  structure(list(ID = 1:10, 
                 bay = c(43L, 43L, 43L, 43L, 43L, 43L, 
                         11L, 11L, 11L, 11L), 
                 row = c(11L, 6L, 13L, 15L, 4L, 2L, 11L, 
                         13L, 12L, 10L), 
                 number = c("ABC", "DEF", "QWE",
                            "XDF", "VGH", "TYU", 
                            "QAS", "QTO", "EWQ", 
                            "RFT")), 
            .Names = c("ID", "bay", "row", "number"), 
            class = "data.frame", 
            row.names = c(NA, -10L))

df <- split(df, df$row %%2 == 0)

df <- 
  mapply(function(DF, decr) DF[order(DF$row, decreasing = decr), ],
         df,
         decr = c(TRUE, FALSE),
         SIMPLIFY = FALSE)

df <- do.call("rbind", df)

答案 1 :(得分:2)

使用aveorder的基础R中的另一个选项是

dat[ave(seq_along(dat$row), dat$bay,
        FUN=function(x) x[order(dat$row[x] * (-1)^dat$row[x])]),]

此方法的灵感来自this answer,但使用ave对使用seq_along(dat$row)构建的data.frame的行位置进行分组和添加顺序。 order,dat $ row [x]中的元素是根据此向量的子集,以便控制分组。

返回

   ID bay row number
4   4  43  15    XDF
3   3  43  13    QWE
1   1  43  11    ABC
6   6  43   2    TYU
5   5  43   4    VGH
2   2  43   6    DEF
8   8  11  13    QTO
7   7  11  11    QAS
10 10  11  10    RFT
9   9  11  12    EWQ

答案 2 :(得分:0)

data.table

的另一个选项
library(data.table)
setDT(dat)[order(row *(-1)^row), .SD, .(bay)]