在 dplyr 0.5.0 中,在分组数据帧上,为什么 slice(1) 没有给出与 filter(row_number() == 1) 相同的行排序?

Ale*_*lex 6 r dplyr

我观察到slice在某些情况下使用时group_by会更改行的顺序。

tmp_df2 <- data.frame(a = c(1, 3, 2, 4), b = c(1, 2, 3, 4))

tmp_df2 %>%
    group_by(a) %>%
    slice(1)
Run Code Online (Sandbox Code Playgroud)

Source: local data frame [4 x 2]
Groups: a [4]

      a     b
  <dbl> <dbl>
1     1     1
2     2     3
3     3     2
4     4     4
Run Code Online (Sandbox Code Playgroud)

tmp_df2 %>%
    group_by(a) %>%
    filter(row_number() == 1)
Run Code Online (Sandbox Code Playgroud)

Source: local data frame [4 x 2]
Groups: a [4]

      a     b
  <dbl> <dbl>
1     1     1
2     3     2
3     2     3
4     4     4
Run Code Online (Sandbox Code Playgroud)

看起来像slice按分组变量的升序对输出重新排序。但是,文档建议slice和过滤器应该以相同的方式运行,特别是从?slice强调我的):

Slice 不适用于关系数据库,因为它们没有行顺序的内在概念。如果要执行等效操作,请使用 filter() 和 row_number()。

ste*_*ian 5

查看代码,slice()通过迭代组来工作,因此其输出将采用组排序形式。我怀疑它比同等filter方法更有效,这就是它实际存在的原因 - 否则它的包含没有任何好处。

我本来可以将此作为评论,但我没有足够的代表 - 所以如果我错了,请温柔地投下反对票