根据另一个数据框提取组的前 N ​​个观察值

Extract the first N observations of groups according to another dataframe

我想从数据框中提取不同组的第一批观察结果。观察数量来自另一个数据框。

这是一个例子:在数据框“x”中,有不同的动物组和他们的名字。

x <- data.frame(animals = c("Mice", "Mice", "Cats", "Cats", "Dogs", "Dogs", "Birds", "Birds"),
       names = c("Jerry", "Speedy", "Tom", "Garfield", "Snoopy", "Pluto", "Tweety", "Donald"))

另一方面,在数据框“y”中,还显示了动物组,以及我希望对各个组进行的观察次数。

y <- data.frame(animals = c("Mice", "Cats", "Dogs", "Birds"),
       firstObs = c(1, 2, 1, 2))

对于老鼠,我想进行第一次观察,对于猫,我想进行前两次(这里是全部),对于狗,我只进行第一次观察,而对于鸟类,我最后再次进行前两次观察。此结果应存储在数据框“z”中。

z <- data.frame(animals = c("Mice", "Cats", "Cats", "Dogs", "Birds", "Birds"),
       names = c("Jerry", "Tom", "Garfield", "Snoopy", "Tweety", "Donald"))

我曾想过使用 dplyr,按“动物”分组,然后使用 head() 函数。但不幸的是,我不知道如何根据组为 head(n=) 传递不同的值....

然后我想到复制“y”中的行并应用左连接。

y.2 <- data.frame(animals = c("Mice", "Cats", "Cats", "Dogs", "Birds", "Birds"))

y.2 %>% left_join(x, by = "animals")

但是,不是连接第一个或前两个观察值,而是扩展 y.2。

因此我想问问您是否有解决我的问题的方法。非常感谢,非常感谢!

加入两个数据集后,在 'first_Obs' 上使用 row_number() 创建逻辑条件

library(dplyr)
left_join(x, y) %>% 
   group_by(animals) %>% 
   filter(row_number() <= first(firstObs)) %>% 
   ungroup %>%
   select(-firstObs)

-输出

# A tibble: 6 × 2
  animals names   
  <chr>   <chr>   
1 Mice    Jerry   
2 Cats    Tom     
3 Cats    Garfield
4 Dogs    Snoopy  
5 Birds   Tweety  
6 Birds   Donald  

或使用 matchslice

x %>% 
  group_by(animals) %>% 
  slice(seq_len(y$firstObs[match(cur_group()$animals, y$animals)])) %>% 
  ungroup
# A tibble: 6 × 2
  animals names   
  <chr>   <chr>   
1 Birds   Tweety  
2 Birds   Donald  
3 Cats    Tom     
4 Cats    Garfield
5 Dogs    Snoopy  
6 Mice    Jerry