使用Order on Aggregate(在单个语句中)

时间:2015-05-31 09:25:09

标签: r

我有一个数据框如下:

ConstantArray

我正在应用 A B 1 1 2 2 1 3 3 2 3 4 3 5 5 3 6 来获取我的数据,如下所示

Aggregate

现在,我想基于> aggregate(B ~ A, mydf, sum) A B 1 1 5 2 2 3 3 3 11 order我的结果,因此我将B函数应用为:

Order

哪个不起作用。然后我申请了

> aggregate(B ~ A, mydf[order(B),], sum)

无效

我应该如何使用> aggregate(B ~ A, mydf, sum)[order(B),] 来获得所需的结果。

3 个答案:

答案 0 :(得分:2)

尝试以下方法:

myagg <- aggregate(B~A,mydf,sum)
myagg[order(myagg$B),]

答案 1 :(得分:1)

正如我在评论中所说,除非你告诉R究竟是什么B以及何时从中得到它,否则你不能只召唤B。有些人正在使用attach不要这样做),以便让他们的生活更轻松,并且在不使用$的情况下调用列,不过在您的情况下,它也会因为您正在创建临时数据集而失败,而附加的B将来自未聚合的数据集。

attach(mydf)
aggregate(B ~ A, mydf, sum)[order(B),]
#       A  B
# 1     1  5
# 2     2  3
# 3     3 11
# NA   NA NA
# NA.1 NA NA
detach(mydf)

所以,现在我们放弃了愚弄,你可以按照我在评论中提到的那样做基础R,并在上面的答案中稍后发布。

res <- aggregate(B ~ A, mydf, sum)  
res[order(res$B), ]

但是这个不会在一个声明中,我不知道这样做的方法。

尽管如此,幸运的是我们有一些可以在一次通话中实现这一目标的软件包。

首先,data.table包(in its devel version on GH)可以使用同一个调用中的setorder函数轻松高效地实现此目的

# library(devtools)
# install_github("Rdatatable/data.table", build_vignettes = FALSE)
library(data.table) ## v >= 1.9.5
res <- setorder(aggregate(B ~ A, mydf, sum), B)

但是,如果我们已经在它,那么正确的data.table语法将是

res <- setorder(setDT(mydf)[, .(B = sum(B)), by = A], B)

另一种方法是使用管道与dplyr包结合使用,以便在一个行动链中实现相同的目标

library(dplyr)
mydf %>%
  group_by(A) %>%
  summarise(B = sum(B)) %>%
  arrange(B)

答案 2 :(得分:-1)

@Saksham:如果你坚持使用一行代码:

aggregate(B~A,mydf,sum)[order(aggregate(B~A,mydf,sum)),]