R 基于作为输入传入的多个列的顺序
我想编写一个函数,通过任意数量的列对给定的data.frame(我将称为dataSet)进行排序,这些列的名称也会传递到函数中(在我将称为orderList的向量中)。我知道,通过单个传入字符串进行排序,您只需使用R 基于作为输入传入的多个列的顺序,r,sorting,dataframe,R,Sorting,Dataframe,我想编写一个函数,通过任意数量的列对给定的data.frame(我将称为dataSet)进行排序,这些列的名称也会传递到函数中(在我将称为orderList的向量中)。我知道,通过单个传入字符串进行排序,您只需使用 sortDataset <- function(dataSet, sortCol) { return(dataSet[order(dataSet[[sortCol]]),]) } 在前两个例子中遇到了一些问题,因为它们不是获取多个列的有效方法(尽管我仍在尝试):,而在第三个例
sortDataset <- function(dataSet, sortCol) {
return(dataSet[order(dataSet[[sortCol]]),])
}
在前两个例子中遇到了一些问题,因为它们不是获取多个列的有效方法(尽管我仍在尝试):,而在第三个例子中,order似乎不接受dataSet[,orderList]返回的矩阵作为参数
我想要一个如下的函数:
sortDataset <- function(dataSet, sortCols)
sortDataset使用do.call
:
data[do.call("order", data[sortCols]), ]
其中,data
是数据框,sortCols
是列名的字符向量
还可以查看doBy软件包中的orderBy
。我们可以使用tidyverse
library(dplyr)
data %>%
arrange_at(vars(sortCols))
可以使用quos/1代码>
sortDataset <- function(dataSet, ...) {
stopifnot(rlang::is_quosures(...))
a1 <- c(...)
dataSet %>%
arrange(!!! a1)
}
sortDataset(mtcars, quos(mpg, cyl))
正如@Nettle在评论中提到的,使用arrange_at
和group_by
可能会导致一些错误(基于听起来像数据。table::setorderv
函数请记住arrange_at
应用于分组变量时可能会有错误。
library(dplyr)
data %>%
arrange_at(vars(sortCols))
sortDataset <- function(dataSet, ...) {
stopifnot(rlang::is_quosures(...))
a1 <- c(...)
dataSet %>%
arrange(!!! a1)
}
sortDataset(mtcars, quos(mpg, cyl))
sortDataset <- function(dataSet, ...) {
a1 <- c(...)
dataSet %>%
arrange_at(vars(a1))
}
sortDataset(mtcars, "mpg", "cyl")