我之前没遇到过这个问题。我想根据条件
将多个列排序为一组中的升序或降序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))
)
答案 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