9

我想data.frame按多列对 a 进行排序,理想情况下使用没有任何外部包的基本 R(尽管如有必要,就这样吧)。已阅读如何按列对数据框进行排序?,我知道我可以使用该order()功能完成此操作,只要我:

  1. 知道每一列的明确名称。
  2. 有一个单独的对象表示要排序的每个单独的列。

但是,如果我只有一个包含多个列名且长度事先未知的向量怎么办?

假设向量被称为sortnames

data[order(data[, sortnames]), ]不起作用,因为order()将其视为单个排序参数。

data[order(data[, sortnames[1]], data[, sortnames[2]], ...), ]当且仅当我指定确切正确数量的 sortname 值时才会起作用,我不会提前知道。

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

  1. eval(parse(text=paste("data[with(data, order(", paste(sortnames, collapse=","), ")), ]"))). 也许这很好,但我已经看到很多人讨厌使用eval(),所以寻求替代品似乎是值得的。
  2. 我也许可以使用Deducer库来做到这一点sortData(),但就像我说的,我宁愿避免使用外部包。

如果我对不使用外部软件包过于固执,请告诉我。我会挺过来的。提前感谢所有想法!

4

1 回答 1

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]), ]

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

于 2013-05-08T13:35:07.930 回答