我正在尝试在多个列上订购数据框。列名称通过变量传递。
df <- data.frame(var1=c("b","a","b","a"),var2=c("l","l","k","k"),var3=c("t","w","x","t"))
var1 var2 var3
1 b l t
2 a l w
3 b k x
4 a k t
使用变量
对一列进行排序sortvar <- "var1"
df[order(df[,sortvar]),]
var1 var2 var3
2 a l w
4 a k t
1 b l t
3 b k x
现在,如果我想按两列排序,则上述解决方案无效。
sortvar <- c("var1","var2")
df[order(df[,sortvar]),] #does not work
我可以手动订购列名。
df[with(df, order(var1,var2)),]
var1 var2 var3
4 a k t
2 a l w
3 b k x
1 b l t
但是,如何使用变量在多列上订购数据框?我知道plyr和dplyr arrange
函数,但我想在这里使用基数R.
答案 0 :(得分:5)
df[do.call(order, df[, sortvar]), ]
期望多个排序变量作为单独的参数,这在您的情况下是不幸的,但建议直接解决方案:使用do.call
:
do.call
如果您不熟悉fun(arg1, arg2, …)
do.call(fun, list(arg1, arg2, …))
:它以编程方式构造并执行调用。以下两个陈述是等效的:
library(ggplot2)
library(reshape)
myddt_m = melt(mydata)
names(myddt_m)=c("Models","CI")
ggplot(myddt_m, aes(Models, CI,fill=Models )) + geom_boxplot()+guides(fill=FALSE)+labs( x="", y="C-Index")
答案 1 :(得分:0)
有点尴尬,但您可以使用 do.call()
将每一列作为不同的参数传递给 order
dat[do.call("order", dat[,cols, drop=FALSE]), ]
我添加了 drop=FALSE
以防万一 length(cols)==1
索引 data.frame 将返回向量而不是列表。你可以把它包裹在一个函数中,让它更容易使用
order_by_cols <- function(data, cols=1) {
data[do.call("order", data[, cols, drop=FALSE]), ]
}
order_by_cols(dat, cols)
如果您可能会考虑使用 dplyr 会更容易一些
library(dplyr)
dat %>% arrange(across(all_of(cols)))
dat %>% arrange_at(cols) # though this method has been superseded by the above line