R 中按组排列的不同 n 的标题行

heading rows with different n by group in R

我正在尝试获取 object 的前 n 个部分,但根据我在其他 object.

中的值,每组的 n 个不同

我有下一个可复制的例子:

a<- tibble(id = c(1,2,3,4,5,6,7,8,9,10), 
           group = c(1,1,1,1,1,2,2,2,2,2))
b<- tibble(group=c(1,2), 
           n = c(3,4))

我想要的是当组为1时获取a的前3行,当组为2时获取a的前4行。

我正在尝试这样做:

  cob<- a %>%  group_by(group) %>% arrange(id, .by_group = TRUE) %>% 
  group_map(~head(.x, b$n))

但是我只得到了两组中的前 3 行,并且每组的大小没有不同。

我们可以做一个连接,然后 filter

library(dplyr)
a %>% 
  left_join(b) %>% 
   group_by(group) %>% 
   filter(row_number() <= first(n)) %>%
   ungroup %>%
   select(-n)

或者另一个选项是

a %>% 
   group_by(group) %>% 
   slice(seq_len(b$n[match(cur_group(), b$group)]))

这是一个data.table解决方案。

library(data.table)
setDT(a)    # only needed because you started with a tibble
setDT(b)    # same
a[b, on=.(group)][, .(id=id[1:n]), by=.(group, n)]

   group n V1
1:     1 3  1
2:     1 3  2
3:     1 3  3
4:     2 4  6
5:     2 4  7
6:     2 4  8
7:     2 4  9

第一个子句:a[b, on=.(group)]b 连接到 a 创建一个 data.table 包含列 groupidn。第二个子句:[, .(id=id[1:n]), by=.(group, n)] groups by group,每组取 id 的前 n 个元素。