data.frame - 如何通过column排序dataframe

在R中,我想按多列对data.frame进行排序。例如,下面的data.frame将按列z (降序)排序,然后按列b (上升)进行排序:


dd <- data.frame(b = factor(c("Hi","Med","Hi","Low"), 
 levels = c("Low","Med","Hi"), ordered = TRUE),
 x = c("A","D","A","C"), y = c(8, 3, 9, 9),
 z = c(1, 1, 1, 2))
dd
 b x y z
1 Hi A 8 1
2 Med D 3 1
3 Hi A 9 1
4 Low C 9 2

时间:

不需要用额外工具,你可以直接使用order()函数-看看这个简单的答案:


R> dd[with(dd, order(-z, b)), ]
 b x y z
4 Low C 9 2
2 Med D 3 1
1 Hi A 8 1
3 Hi A 9 1

大约2年后编辑: 它只是被问到如何用列索引做这个,答案是将所需的排序列传递到order()函数:


R> dd[ order(-dd[,4], dd[,1]), ]
 b x y z
4 Low C 9 2
2 Med D 3 1
1 Hi A 8 1
3 Hi A 9 1
R> 

使用Kevin Wright的这个(非常有用的)函数,R维基,这很容易实现。


> sort(dd,by = ~ -z + b)
 b x y z
4 Low C 9 2
2 Med D 3 1
1 Hi A 8 1
3 Hi A 9 1


library(dplyr)
# sort mtcars by mpg, ascending... use desc(mpg) for descending
arrange(mtcars, mpg)
# sort mtcars first by mpg, then by cyl, then by wt)
arrange(mtcars , mpg, cyl, wt)

针对操作的问题:


arrange(dd, desc(z), b)

 b x y z
1 Low C 9 2
2 Med D 3 1
3 Hi A 8 1
4 Hi A 9 1

假设你有一个data.frameA,并且希望使用称为x递减顺序的列对它进行排序。 调用排序的data.framenewdata


newdata <- A[order(-A$x),]

如果你想要升序,则将"-"替换为无。


newdata <- A[order(-A$x, A$y, -A$z),]

其中xzdata.frameA中的一些列,这意味着按x降序排序data.frameAy上升和z下降。

使用例子代码:


dd <- dd[with(dd, order(-z, b)), ] 

...