gpt4 book ai didi

r - 在聚合上使用 Order(在单个语句中)

转载 作者:行者123 更新时间:2023-12-02 17:32:59 26 4
gpt4 key购买 nike

我有一个数据框如下:

  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

现在,我想根据 B order 我的结果,所以我将 Order 函数应用为:

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

这没有用。然后我申请了

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

也没用

我应该如何使用 Order 来获得想要的结果。

最佳答案

正如我在评论中所说,您不能只调用 B 除非您告诉 R 什么是 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)

现在我们不再胡闹了,使用 base 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 包结合使用,以便在一个 Action 链中实现相同的目标

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

关于r - 在聚合上使用 Order(在单个语句中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30555837/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com