Извлечение неравного количества строк по группам в r - PullRequest
2 голосов
/ 20 февраля 2020

У меня есть два переменных кадра данных, сгруппированных по Shape, и я хотел бы извлечь первые 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 ц. Ожидаемый результат:

Out <- data.frame(Shape = c("R", "R", "C", "T", "T", "T"), Area = c(35, 30, 32, 40, 35, 33))

Ответы [ 2 ]

2 голосов
/ 20 февраля 2020

Немного сложнее, чем версия Акруна, но, возможно, легче читать:

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)))
2 голосов
/ 20 февраля 2020

Мы можем сделать group_split в list из data.frame со столбцом 'Shape' и затем передать ограничение 'n' в map2 до filter числа строк соответственно

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

Или другой вариант - создать столбец n, передав именованный вектор, а затем сгруппировать по Shape, выполнив команду filter

Data %>%
    mutate(n = setNames(c(2, 1, 3), unique(Shape))[as.character(Shape)]) %>% 
    group_by(Shape) %>%
    filter(row_number() <= n[1]) %>%
    select(-n)
...