2013-05-08 88 views
9

我想排序data.frame多列,理想情況下使用基地R沒有任何外部包(儘管如果有必要,所以它)。看了How to sort a dataframe by column(s)?,我知道我可以,只要與order()功能做到這一點,因爲我可以:將data.frame按名稱包含在單個對象中的多列進行排序?

  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(),但正如我所說的,我寧願避免使用外部軟件包。

如果我對使用外部軟件包過於固執,請告訴我。我會挺過來的。所有的想法提前讚賞!

回答

8

您可以使用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]), ] 

這招是非常有用的。

+0

這太棒了 - 我已經閱讀過過去的do.call幫助文件,並一直認爲這一定非常有幫助,但從來沒有想出使用它的好理由。謝謝! – 2013-05-08 13:38:54

+1

請注意,這將適用於data.frame。對於矩陣,您必須將它們轉換爲列表:'lapply(sortnames,function(x)data [,x])' – mpiktas 2013-05-08 13:42:08

相關問題