为什么dplyr安排不订购我的数据帧?

时间:2015-04-17 23:02:18

标签: r dplyr

我有以下数据框

> S
Source: local data frame [1,991 x 3]
Groups: exp

   exp year commval
1  alb 1995     186
2  alb 1997     232
3  alb 1998     244
4  alb 2000     251
5  alb 1996     275
6  alb 1999     290
7  alb 2001     313
8  alb 2002     358
9  alb 2003     471
10 alb 2004     608
.. ...  ...     ...

我希望过滤年份== 1995而不是重新订购:

> S %>% filter(year == 1995) %>% arrange(commval)
Source: local data frame [130 x 3]
Groups: exp

   exp year commval
1  alb 1995     186
2  are 1995   20266
3  arg 1995   21178
4  arm 1995      60
5  aus 1995   49855
6  aut 1995   50115
7  aze 1995     102
8  bel 1995  150850
9  ben 1995     182
10 bfa 1995     231
.. ...  ...     ...

正如您所看到的,结果不是在commval上排序,而是在exp上排序。我在这里做错了什么?

有关conflict()和sessionInfo()的更多信息:

> conflicts()
[1] "filter"    "body<-"    "intersect" "kronecker" "setdiff"   "setequal"  "union"    

> sessionInfo()
R version 3.1.2 (2014-10-31)
Platform: x86_64-apple-darwin13.4.0 (64-bit)

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] dplyr_0.3.0.2  igraph_0.7.1   reshape2_1.4.1

loaded via a namespace (and not attached):
[1] assertthat_0.1  DBI_0.3.1       lazyeval_0.1.10 magrittr_1.5    parallel_3.1.2  plyr_1.8.1     
[7] Rcpp_0.11.3     stringr_0.6.2   tools_3.1.2 

2 个答案:

答案 0 :(得分:5)

从输出

Source: local data frame [1,991 x 3]
Groups: exp

我们可以看到您的数据按exp分组。这意味着当您安排时,您将安排这些小组。如果这不是你想要的,那就

S %>% filter(year == 1995) %>% ungroup() %>% arrange(commval)

在安排

之前取消组合数据

答案 1 :(得分:1)

在不同版本的dplyr中,arrange对分组数据的行为已经改变了几次。自0.7版(2017年9月)起,默认情况下arrange按组排序,因此

data %>% group_by(grp) %>% arrange(x)

将按x排序,而不考虑grp(这实际上使原始问题无效)。

要更改此设置,请在对.by_group=TRUE

的调用中指定arrange
data %>% group_by(grp) %>% arrange(x, .by_group=TRUE)

这将按grp排序,然后按x内的grp排序。