如何按多列对数据框进行排序

如何按多列对数据框进行排序

我想按多列对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


慕沐林林
浏览 1724回答 4
4回答

拉丁的传说

德克的答案很棒。它还强调了用于索引data.frames和data.tables&nbsp;的语法的主要区别:##&nbsp;The&nbsp;data.frame&nbsp;waydd[with(dd,&nbsp;order(-z,&nbsp;b)),&nbsp;]##&nbsp;The&nbsp;data.table&nbsp;way:&nbsp;(7&nbsp;fewer&nbsp;characters,&nbsp;but&nbsp;that's&nbsp;not&nbsp;the&nbsp;important&nbsp;bit)dd[order(-z,&nbsp;b)]这两个电话之间的差异很小,但它可能会产生重要影响。特别是如果您编写生产代码和/或关注研究中的正确性,最好避免不必要的重复变量名称。data.table&nbsp;帮助你做到这一点。这是一个如何重复变量名称可能会让您陷入麻烦的示例:让我们从Dirk的答案中改变背景,并说这是一个更大的项目的一部分,其中有很多对象名称,它们很长很有意义;&nbsp;而不是dd它被称为quarterlyreport。它成为了 :quarterlyreport[with(quarterlyreport,order(-z,b)),]好的。没有错。接下来,您的老板要求您在报告中包含上一季度的报告。你仔细检查代码,lastquarterlyreport在各个地方添加一个对象,以某种方式(地球上怎么样?)你最终会得到这个:quarterlyreport[with(lastquarterlyreport,order(-z,b)),]这不是你的意思,但你没有发现它,因为你做得很快,而且它坐落在一个类似代码的页面上。代码不会失败(没有警告也没有错误),因为R认为这就是你的意思。你希望看到你的报告的人发现它,但也许他们没有。如果您经常使用编程语言,那么这种情况可能都是熟悉的。你会说这是一个“错字”。我会解决你对老板说的“拼写错误”。在data.table我们关注这样微小的细节。所以我们做了一些简单的事情,以避免两次输入变量名。非常简单。i在dd自动框架内进行评估。你根本不需要with()。代替dd[with(dd,&nbsp;order(-z,&nbsp;b)),&nbsp;]只是dd[order(-z,&nbsp;b)]而不是quarterlyreport[with(lastquarterlyreport,order(-z,b)),]只是quarterlyreport[order(-z,b)]这是一个非常小的差异,但它可能只是有一天挽救你的脖子。权衡此问题的不同答案时,请考虑将变量名称的重复计算为您决定的标准之一。有些答案有不少重复,有些则没有。

Helenr

这里有很多优秀的答案,但是dplyr提供了我能够快速且容易记住的唯一语法(现在经常使用):library(dplyr)# sort mtcars by mpg, ascending... use desc(mpg) for descendingarrange(mtcars, mpg)# sort mtcars first by mpg, then by cyl, then by wt)arrange(mtcars , mpg, cyl, wt)对于OP的问题:arrange(dd, desc(z),&nbsp; b)&nbsp; &nbsp; b x y z1 Low C 9 22 Med D 3 13&nbsp; Hi A 8 14&nbsp; Hi A 9 1
打开App,查看更多内容
随时随地看视频慕课网APP