我有一个数据框如下:
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),]
来获得所需的结果。
答案 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)),]