使用变量按多列排序数据框

时间:2017-05-10 15:46:33

标签: r

我正在尝试在多个列上订购数据框。列名称通过变量传递。

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.

2 个答案:

答案 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