在r中按组提取不等行数

在r中按组提取不等行数,r,dataframe,row,extract,R,Dataframe,Row,Extract,我有一个按形状分组的两变量数据框,希望提取前n行数n对于每个组的分组变量的每个级别都是不同的。我尝试了一些dplyr和data.table函数,但它们似乎只适用于相同数量的行 Data <- data.frame(Shape = c("R", "R", "R", "C", "C", "T", "T", "T", "T"), Area = c(35, 30, 25, 32, 28, 40, 35, 33, 31)) 我希望获得前2个Rs、第一个C和前3个T。预期结果: Out <-

我有一个按形状分组的两变量数据框,希望提取前n行数n对于每个组的分组变量的每个级别都是不同的。我尝试了一些dplyr和data.table函数,但它们似乎只适用于相同数量的行

Data <- data.frame(Shape = c("R", "R", "R", "C", "C", "T", "T", "T", "T"), Area = c(35, 30, 25, 32, 28, 40, 35, 33, 31))
我希望获得前2个Rs、第一个C和前3个T。预期结果:

Out <- data.frame(Shape = c("R", "R", "C", "T", "T", "T"), Area = c(35, 30, 32, 40, 35, 33))
我们可以使用'Shape'列将一个组分割成data.frame列表,然后在map2中传递限制'n'以相应地过滤行数

library(dplyr)
library(purrr)
Data %>% 
  group_split(Shape = factor(Shape, levels = unique(Shape))) %>% 
  map2_dfr(., c(2, 1, 3), ~ .x %>%
                             filter(row_number() <= .y))
# A tibble: 6 x 2
#  Shape  Area
#* <fct> <dbl>
#1 R        35
#2 R        30
#3 C        32
#4 T        40
#5 T        35
#6 T        33

比akrun的版本稍微复杂一些,但可能更容易阅读:

library(tidyverse)

numberRows <- tibble(Shape = c("R", "C", "T")
        , firstRows = c(2,1,3))

Data %>%
    left_join(numberRows, "Shape") %>%
    group_by(Shape) %>%
    slice(1:(mean(firstRows)))

非常感谢您的快速回复@akrun!这正是我想要的。@akurn-我想知道这种方法是否适用于多个分组变量,而不是仅适用于一个变量-比如说3个分组变量。谢谢。您只需要在组中添加这些变量by@BMM如果您有“n”个组,那么最好有一个key/val数据集,即keydat Hi@Georgery-我尝试了您的方法,但由于某些原因,我没有得到问题中的预期结果。我得到了2个Rs,2个Cs和2个Ts,而不是2个Rs,1个C和3个T。我打算用你的方法来解决一个更复杂的问题——多个分组变量。谢谢你的帮助!你有时间看我的问题吗?谢谢。如果我有多个分组变量,并且多个组具有相同的firstRows值,那么我是否仍然按firstRows或分组变量进行分组,并使用相同的方法。谢谢你的帮助。如果有多个分组变量,则需要将它们包括在1中。在numberRows数据帧2中。在左_连接和3的by=参数中。在小组里。
library(tidyverse)

numberRows <- tibble(Shape = c("R", "C", "T")
        , firstRows = c(2,1,3))

Data %>%
    left_join(numberRows, "Shape") %>%
    group_by(Shape) %>%
    slice(1:(mean(firstRows)))