为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕沐林林 2019-05-24 16:08:03
如何按多列对数据框进行排序我想按多列对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 z1  Hi A 8 12 Med D 3 13  Hi A 9 14 Low C 9 2
查看完整描述

4 回答

?
拉丁的传说

TA贡献1789条经验 获得超8个赞

德克的答案很棒。它还强调了用于索引data.frames和data.tables 的语法的主要区别:

## The data.frame waydd[with(dd, order(-z, b)), ]## The data.table way: (7 fewer characters, but that's not the important bit)dd[order(-z, b)]

这两个电话之间的差异很小,但它可能会产生重要影响。特别是如果您编写生产代码和/或关注研究中的正确性,最好避免不必要的重复变量名称。data.table 帮助你做到这一点。

这是一个如何重复变量名称可能会让您陷入麻烦的示例:

让我们从Dirk的答案中改变背景,并说这是一个更大的项目的一部分,其中有很多对象名称,它们很长很有意义; 而不是dd它被称为quarterlyreport。它成为了 :

quarterlyreport[with(quarterlyreport,order(-z,b)),]

好的。没有错。接下来,您的老板要求您在报告中包含上一季度的报告。你仔细检查代码,lastquarterlyreport在各个地方添加一个对象,以某种方式(地球上怎么样?)你最终会得到这个:

quarterlyreport[with(lastquarterlyreport,order(-z,b)),]

这不是你的意思,但你没有发现它,因为你做得很快,而且它坐落在一个类似代码的页面上。代码不会失败(没有警告也没有错误),因为R认为这就是你的意思。你希望看到你的报告的人发现它,但也许他们没有。如果您经常使用编程语言,那么这种情况可能都是熟悉的。你会说这是一个“错字”。我会解决你对老板说的“拼写错误”。

data.table我们关注这样微小的细节。所以我们做了一些简单的事情,以避免两次输入变量名。非常简单。idd自动框架内进行评估。你根本不需要with()

代替

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

只是

dd[order(-z, b)]

而不是

quarterlyreport[with(lastquarterlyreport,order(-z,b)),]

只是

quarterlyreport[order(-z,b)]

这是一个非常小的差异,但它可能只是有一天挽救你的脖子。权衡此问题的不同答案时,请考虑将变量名称的重复计算为您决定的标准之一。有些答案有不少重复,有些则没有。


查看完整回答
反对 回复 2019-05-24
?
Helenr

TA贡献1780条经验 获得超3个赞


这里有很多优秀的答案,但是dplyr提供了我能够快速且容易记住的唯一语法(现在经常使用):


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)

对于OP的问题:


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


查看完整回答
反对 回复 2019-05-24
  • 4 回答
  • 0 关注
  • 1721 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信