首页 > 解决方案 > 在多列混合 asc & desc 顺序上使用功能排列/交叉

问题描述

我想订购iris如下,但如果可能的话,使用单个语句使用变量名:

# Result I want but using variable names
x1 <- iris %>% arrange(Species, desc(Sepal.Length))

# Working solution (with multiple statements)
x2 <- iris %>% arrange(across(any_of("Sepal.Length"), desc)) %>% arrange(across(any_of("Species")))

# My try : not working (one statement)
asc <- function(x) {return(x)}
x3 <- iris %>% arrange(across(any_of(c("Species", "Sepal.Length")), .fns = list(asc, desc)))

identical(x1, x2)
identical(x1, x3)

据我了解,当您使用时,arrange(across(.cols, .fns))您可以使用desc,但它会影响您的所有变量......

标签: rdplyr

解决方案


尝试使用.data

x2 <- iris %>% arrange(.data[["Species"]], desc(.data[["Sepal.Length"]]))
identical(x1, x2)
## [1] TRUE

这也可以像这样在基础 R 中完成:

o <- order(iris[["Species"]], -xtfrm(iris[["Sepal.Length"]]))
x3 <- iris[o, ]
all.equal(x1, x3, check.attributes = FALSE)
## [1] TRUE

或者像这样在sql中:

library(sqldf)
v1 <- "Species"
v2 <- "Sepal.Length"
x4 <- fn$sqldf("select * from iris order by [$v1], [$v2] desc")
all.equal(x1, x4, check.attributes = FALSE)
## [1] TRUE

推荐阅读