如何在dplyr中按降序排列奇数,按升序排列偶数

如何在dplyr中按降序排列奇数,按升序排列偶数,r,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

我在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  
我想将奇数按降序排列,偶数按升序按间隔分组

我想要的数据帧如下

  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中执行此操作

库(dplyr)
library(dplyr)

df <- read.table(text =
"   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 ",
  stringsAsFactors = FALSE, header = TRUE)

arrange(df, desc(bay), desc(row %% 2), row * (-1)^(row%%2))

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

df对于
base
解决方案,按
是奇数还是偶数拆分数据,并使用
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)

df在base R中使用
ave
order
的另一个选项是

dat[ave(seq_along(dat$row), dat$bay,
        FUN=function(x) x[order(dat$row[x] * (-1)^dat$row[x])]),]
此方法受
ave
的启发,但使用
ave
对data.frame的行位置进行分组和添加顺序,并使用
seq_-along(dat$row)
构建。
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

另一个带有
data.table的选项

library(data.table)
setDT(dat)[order(row *(-1)^row), .SD, .(bay)]

是否有理由不在所需输出中重新排列
ID
?你也要重新编号
ID
s吗?@Aurele很抱歉,我忘了更改输出。使用基数R:
与(df,df[order(-bay,-(row%%2),row*(-1)^(row%%2)),])或
df[order(-df$bay,-(df$row%%2),df$row*(-1)^(df$row%%2)),]进行差异。