按名称包含在单个对象中的多个列对data.frame进行排序?

时间:2013-05-08 13:25:40

标签: r

我希望按多列对data.frame进行排序,理想情况下使用基本R而不使用任何外部包(尽管如果必要,也可以这样)。阅读How to sort a dataframe by column(s)?之后,我知道只要我这样做,就可以使用order()函数完成此任务:

  1. 了解每列的明确名称。
  2. 有一个单独的对象,表示要对其进行排序的每个列。
  3. 但是如果我只有一个包含多个列名的向量,其长度是事先未知的呢?

    假设向量被称为sortnames

    data[order(data[, sortnames]), ]无效,因为order()将其视为单个排序参数。

    当且仅当我指定了确切正确数量的sortname值时,

    data[order(data[, sortnames[1]], data[, sortnames[2]], ...), ]才会起作用,我不会提前知道。

    我看过的但并不完全满意的事情:

    1. eval(parse(text=paste("data[with(data, order(", paste(sortnames, collapse=","), ")), ]")))。也许这很好,但我看到很多人讨厌使用eval(),所以要求替代方案似乎是值得的。
    2. 我可以使用Deducer库来执行sortData(),但就像我说的那样,我宁愿避免使用外部包。
    3. 如果我对不使用外包装太顽固,请告诉我。我会挺过来的。所有想法提前赞赏!

1 个答案:

答案 0 :(得分:9)

您可以使用do.call

data<-data.frame(a=rnorm(10),b=rnorm(10)) 
data<-data.frame(a=rnorm(10),b=rnorm(10),c=rnorm(10))
sortnames <- c("a", "b")
data[do.call("order", data[sortnames]), ]

当您想要将多个参数传递给函数并且这些参数位于方便的命名列表中时,此技巧很有用。