按R中的多个列对data.frame进行排序

时间:2014-03-18 01:13:02

标签: r

我知道排序数据框架已经被无休止地讨论过了,但是我无法找到我特定问题的答案所以我希望你不要介意我再次启动这个主题...... 问题在于:我有一个包含许多列的数据框,并希望使用所有列对其进行排序,而不对任何列进行优先排序(即不按第1列排序,然后按第2列排序等)。

我试过订单,但这似乎没有办法。 这是一个例子:

1  1 0 8 1
2  4 2 9 1
3  8 0 0 2
4  0 0 3 1
5  0 0 0 2
6  5 7 2 9
7  1 0 0 0

首选输出:

1  5 7 2 9
2  4 2 9 1
3  1 0 8 1
4  8 0 0 2
5  0 0 3 1
6  0 0 0 2
7  1 0 0 0

很抱歉没有更具体,但我希望这个例子粗略地解释了我想要的东西。 请注意,我的数据框有5000行和15列(全部数字)。

1 个答案:

答案 0 :(得分:0)

dat[ rev(order(     # need to reverse the default increasing order result
       apply(dat,1,function(x) 
          paste(sprintf("%05.0f", sort(x)), collapse=".") ) )) , ]

我知道有一个学校虽然裸代码是不够的,但我认为一旦你学会从内向外思考R的功能范例,最合理简单的功能就是自我记录:阅读本文1)排序行内的值; 2]用前导零连接排序值以允许字符排序; 3)使用字符索引作为排序。在我看来,你可能需要在排序的数值周围包裹一个sprintf(),以防止“2”在玩具示例以外的任何东西中变得更“10”。

> sprintf("%05.0f", 10)
#[1] "00010"

dat <- read.table(text="1  1 0 8 1
 2  4 2 9 1
 3  8 0 0 2
 4  0 0 3 1
 5  0 0 0 2
 6  5 7 2 9
 7  1 0 0 0")[-1]
dat[ rev(order( apply(dat,1,function(x) paste(sprintf("%05.0f", sort(x)), collapse=".") ) )) , ]
  V2 V3 V4 V5
6  5  7  2  9
2  4  2  9  1
1  1  0  8  1
3  8  0  0  2
4  0  0  3  1
5  0  0  0  2
7  1  0  0  0