为什么聚合和汇总会给出不同顺序的答案?

5
如果我使用 "aggregate" 函数或 "dplyr" 包中的 "summarise" 进行计算,为什么会得到不同顺序的答案?
例如:
a <- aggregate(hp~mpg+cyl+gear, mtcars, FUN = sum)

给我
 mpg cyl gear  hp
1  21.5   4    3  97
2  18.1   6    3 105
3  21.4   6    3 110
4  10.4   8    3 420
5  13.3   8    3 245

并且。
b <- mtcars %>%
     group_by(mpg, cyl, gear) %>%
     summarise(hp = sum(hp))

给我

    mpg   cyl  gear    hp
   <dbl> <dbl> <dbl> <dbl>
 1  10.4     8     3   420
 2  13.3     8     3   245
 3  14.3     8     3   245
 4  14.7     8     3   230
 5  15       8     5   335

为什么顺序不同?

1
我猜这是因为使用 group_bympgcylgear 排序列,因此您会得到相同的输出,只是排序不同。 - hannes101
3
在dplyr的GitHub上涉及到很多这方面的问题,例如#2159。看起来group_by函数总是会重新排序。 - zx8754
1个回答

1

正如@zx8754所提到的,tidyverse操作将重新排序行。不能保证您会得到特定的行顺序。 https://github.com/tidyverse/dplyr/issues/2192#issuecomment-281655703

仔细观察后,我发现聚合按gear、cyl、mpg排序。 因此,以下tidyverse代码将提供与aggregate(hp~mpg+cyl+gear, mtcars, FUN = sum)相同的行顺序:

library(tidyverse)
mtcars %>% group_by(gear, cyl, mpg) %>% summarise(hp = sum(hp)) %>% head()
#> # A tibble: 6 x 4
#> # Groups:   gear, cyl [3]
#>    gear   cyl   mpg    hp
#>   <dbl> <dbl> <dbl> <dbl>
#> 1     3     4  21.5    97
#> 2     3     6  18.1   105
#> 3     3     6  21.4   110
#> 4     3     8  10.4   420
#> 5     3     8  13.3   245
#> 6     3     8  14.3   245

这段内容创建于2019年2月27日,使用了reprex package (v0.2.1)

为了得到与mtcars %>% group_by(mpg, cyl, gear) %>% summarise(hp = sum(hp))相同的行顺序:

library(tidyverse)
aggregate(hp~gear+cyl+mpg, mtcars, FUN = sum) %>% head()
#>   gear cyl  mpg  hp
#> 1    3   8 10.4 420
#> 2    3   8 13.3 245
#> 3    3   8 14.3 245
#> 4    3   8 14.7 230
#> 5    5   8 15.0 335
#> 6    3   8 15.2 330

此内容由reprex package (v0.2.1)于2019-02-27创建


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接