我希望按多列对data.frame
进行排序,理想情况下使用基本R而不使用任何外部包(尽管如果必要,也可以这样)。阅读How to sort a dataframe by column(s)?之后,我知道只要我这样做,就可以使用order()
函数完成此任务:
但是如果我只有一个包含多个列名的向量,其长度是事先未知的呢?
假设向量被称为sortnames
。
data[order(data[, sortnames]), ]
无效,因为order()
将其视为单个排序参数。
data[order(data[, sortnames[1]], data[, sortnames[2]], ...), ]
才会起作用,我不会提前知道。
我看过的但并不完全满意的事情:
eval(parse(text=paste("data[with(data, order(", paste(sortnames, collapse=","), ")), ]")))
。也许这很好,但我看到很多人讨厌使用eval()
,所以要求替代方案似乎是值得的。Deducer
库来执行sortData()
,但就像我说的那样,我宁愿避免使用外部包。 如果我对不使用外包装太顽固,请告诉我。我会挺过来的。所有想法提前赞赏!
答案 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]), ]
当您想要将多个参数传递给函数并且这些参数位于方便的命名列表中时,此技巧很有用。