R中的dplyr中的“添加缺少的分组变量”消息

时间:2016-07-21 18:25:24

标签: r dplyr

我的部分脚本之前运行正常,但最近一直在生成一个奇怪的声明,之后我的许多其他功能都无法正常工作。我试图在每个站点的排名值列表中选择第8和第23个位置,以找到每个站点30年内每年每天的第25和第75百分位值。我的方法如下(适用于四行数据集 - slice(3)通常是我的完整30年数据集的切片(23):

library(“dplyr”)

mydata

structure(list(station_number = structure(c(1L, 1L, 1L, 1L), .Label = "01AD002", class = "factor"), 
year = 1981:1984, month = c(1L, 1L, 1L, 1L), day = c(1L, 
1L, 1L, 1L), value = c(113, 8.329999924, 15.60000038, 149
)), .Names = c("station_number", "year", "month", "day", "value"), class = "data.frame", row.names = c(NA, -4L))    

  value <- mydata$value
  qu25 <- mydata %>% 
          group_by(month, day, station_number) %>% 
          arrange(desc(value)) %>% 
          slice(3) %>% 
          select(value)

之前,我会留下一个表,每个站点有一个值来描述第25个百分点(因为排列函数似乎从最高到最低排序)。但是,现在当我运行这些行时,我收到一条消息:

Adding missing grouping variables: `month`, `day`, `station_number`

这条消息对我没有意义,因为分组变量显然存在于我的表中。而且,直到最近,这一点工作正常。我试过了:

  • detatch(“plyr”) - 因为我在dplyr
  • 之前加载了它
  • dplyr :: group_by - 将其直接放在group_by行
  • 卸载并重新安装dplyr,虽然这是我遇到的另一个问题

知道为什么我可能会收到此消息以及为什么它可能已停止工作?

感谢您的帮助。

更新:添加了一个站点的dput示例,但是多年的1月1日的值。希望是一旦分组就返回位置值,例如,slice(3)将有希望返回该较小子集的15.6值。

3 个答案:

答案 0 :(得分:40)

为了保持一致,分组变量应该在前面定义时始终存在,因此在执行select(value)时添加。 ungroup应该解决它:

qu25 <- mydata %>% 
  group_by(month, day, station_number) %>%
  arrange(desc(value)) %>% 
  slice(2) %>% 
  ungroup() %>%
  select(value)

请求的结果没有警告:

> mydata %>% 
+   group_by(month, day, station_number) %>%
+   arrange(desc(value)) %>% 
+   slice(2) %>% 
+   ungroup() %>%
+   select(value)
# A tibble: 1 x 1
  value
  <dbl>
1   113

答案 1 :(得分:4)

您最近偶然更新了dplyr吗?我想知道您的dplyr :: arrange电话是否受到https://blog.rstudio.org/2016/06/27/dplyr-0-5-0/

的不利影响
  

突破变化   arrange()再次忽略分组,回复   对dplyr 0.3及更早版本的行为。这使得arrange()   与其他dplyr动词不一致,但我认为这种行为是   通常更有用。无论如何,它不会再像以前一样改变   更多的变化只会引起更多的混乱。

答案 2 :(得分:2)

您还可以使用data.frame()在选择语句之前将小标题转换为数据帧。则dplyr会失去对分组变量的跟踪,并且不再担心它们。

qu25 <- mydata %>% 
      group_by(month, day, station_number) %>% 
      arrange(desc(value)) %>% 
      slice(3) %>% 
      data.frame() %>%
      select(value)