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

Ros*_*tev 7 group-by r dplyr

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

mtcars %>%
  group_by(cyl) %>%
  select_first_n_groups(2) %>%
  do({'complicated expression'})
Run Code Online (Sandbox Code Playgroud)

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

G. *_*eck 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)
Run Code Online (Sandbox Code Playgroud)

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

  • 截至 2019 年,我不得不修改函数:`select_groups &lt;- function(dd, gr, ...) dd[sort(unlist(attr(dd, "groups")$.rows[ gr ])), ]` (3认同)

Hol*_*ndl 7

随着一点点dplyr的一些嵌套沿着/ unnesting(由支持tidyr包),你可以建立一个小帮手,以获得第一(或组)

first = function(x) x %>% nest %>% slice(1) %>% unnest(data)
mtcars %>% group_by(cyl) %>% first()
Run Code Online (Sandbox Code Playgroud)

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

该名称是受所有功能性API启发的first(请参阅stdlibs,例如kotlin,python,scala,java,spark)。

确保它也可以通过直接运行而无需辅助功能

mtcars %>% group_by(cyl) %>% nest %>% slice(1) %>% unnest(data)
Run Code Online (Sandbox Code Playgroud)