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

我正在观察当使用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)

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

tmp_df2 %>%
    group_by(a) %>%
    filter(row_number() == 1)

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

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

Slice does not work with relational databases because they have no intrinsic notion of row order. If you want to perform the equivalent operation, use filter() and row_number().

最佳答案 查看代码,slice()通过迭代组来工作,因此它的输出将是组排序形式.我怀疑它比等效过滤器方法更有效,这就是为什么它实际存在 – 否则它的包含没有任何好处.

我会留下这个作为评论,但我没有足够的代表 – 所以如果我错了就要温和地进行投票

点赞