如何在dplyr中提取一个特定的组

时间:2014-10-22 08:36:40

标签: r group-by dplyr

给定一个分组的tbl,我可以提取一个/几个组吗? 在对代码进行原型设计时,这种功能非常有用,例如:

mtcars %>%
  group_by(cyl) %>%
  select_first_n_groups(2) %>%
  do({'complicated expression'})

当然,可以在分组之前进行显式过滤,但这可能很麻烦。

2 个答案:

答案 0 :(得分:8)

尝试使用groups是组号的向量。这里1:2表示前两组:

select_groups <- function(data, groups, ...) 
   data[sort(unlist(attr(data, "indices")[ groups ])) + 1, ]

mtcars %>% group_by(cyl) %>% select_groups(1:2)

所选行以原始顺序显示。如果您希望行按照指定组的顺序显示(例如,在上面的eaxmple中,第一组的行后跟第二组的行),则删除sort

答案 1 :(得分:5)

有一点dplyr以及一些嵌套/取消(由tidyr包支持),你可以建立一个小帮手来获得第一个(或任何)组

first = function(x) x %>% nest %>% slice(1) %>% unnest(data)
mtcars %>% group_by(cyl) %>% first()

通过调整切片,您还可以按索引提取第n个或任何范围的组,但通常第一个或最后一个是大多数用户想要的。

该名称的灵感来自功能API,它们都称之为first(参见kotlin,python,scala,java,spark等stdlibs)。

当然,通过直接运行

,它也可以在没有辅助功能的情况下工作
mtcars %>% group_by(cyl) %>% nest %>% slice(1) %>% unnest(data)