R - 有条件地将多列排序为按组升序或降序

时间:2018-02-21 23:57:12

标签: r sorting

我之前没遇到过这个问题。我想根据条件

将多个列排序为一组中的升序或降序
library(dplyr)
data <- mtcars %>% select(mpg, cyl, disp)

如果cyl <= 4,我想按升序排序mpg, disp(在该优先级中)。如果cyl > 4,我想按降序排序mpg, disp

expected <- rbind(
    filter(data, cyl <= 4) %>% arrange(mpg, disp),
    filter(data, cyl > 4) %>% arrange(cyl, desc(mpg), desc(disp))
)

2 个答案:

答案 0 :(得分:2)

将每个变量乘以可能被sign(4.1 - cyl)反转:

mtcars %>% arrange(cyl, sign(4.1 - cyl) * mpg, sign(4.1 - cyl) * disp)

如果mpg,例如,不是数字,则可以通过将mpg替换为xtfrm(mpg)并将其映射到数字来实现。请参阅?xtfrm

答案 1 :(得分:1)

我们可以将值转换为负值以创建新列,然后对这些列进行排序。

library(dplyr)

data2 <- data %>%
  mutate_at(vars(mpg, cyl), funs(ifelse(cyl <= 4, ., -.))) %>%
  arrange(cyl, mpg2, disp2) %>%
  select(-ends_with("2"))
data2
#     mpg cyl  disp
# 1  21.4   4 121.0
# 2  21.5   4 120.1
# 3  22.8   4 108.0
# 4  22.8   4 140.8
# 5  24.4   4 146.7
# 6  26.0   4 120.3
# 7  27.3   4  79.0
# 8  30.4   4  75.7
# 9  30.4   4  95.1
# 10 32.4   4  78.7
# 11 33.9   4  71.1
# 12 21.4   6 258.0
# 13 21.0   6 160.0
# 14 21.0   6 160.0
# 15 19.7   6 145.0
# 16 19.2   6 167.6
# 17 18.1   6 225.0
# 18 17.8   6 167.6
# 19 19.2   8 400.0
# 20 18.7   8 360.0
# 21 17.3   8 275.8
# 22 16.4   8 275.8
# 23 15.8   8 351.0
# 24 15.5   8 318.0
# 25 15.2   8 304.0
# 26 15.2   8 275.8
# 27 15.0   8 301.0
# 28 14.7   8 440.0
# 29 14.3   8 360.0
# 30 13.3   8 350.0
# 31 10.4   8 472.0
# 32 10.4   8 460.0