4 回答
TA贡献1789条经验 获得超8个赞
德克的答案很棒。它还强调了用于索引data.frame
s和data.table
s 的语法的主要区别:
## 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
我们关注这样微小的细节。所以我们做了一些简单的事情,以避免两次输入变量名。非常简单。i
在dd
自动框架内进行评估。你根本不需要with()
。
代替
dd[with(dd, order(-z, b)), ]
只是
dd[order(-z, b)]
而不是
quarterlyreport[with(lastquarterlyreport,order(-z,b)),]
只是
quarterlyreport[order(-z,b)]
这是一个非常小的差异,但它可能只是有一天挽救你的脖子。权衡此问题的不同答案时,请考虑将变量名称的重复计算为您决定的标准之一。有些答案有不少重复,有些则没有。
TA贡献1780条经验 获得超4个赞
这里有很多优秀的答案,但是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
- 4 回答
- 0 关注
- 1777 浏览
添加回答
举报