Dplyr pipe groupby top_n не попадает в группу top_n - PullRequest
0 голосов
/ 09 мая 2020

Я пытаюсь получить 2 первых имени, отсортированных в алфавитном порядке для каждой группы. Я бы подумал, что top_n() выберет это после того, как я выполню group_by. Однако, похоже, это не так. Этот код показывает проблему.

df <- data.frame(Group = c(0, 0, 0, 1, 1, 1),
                 Name = c("a", "c", "b", "e", "d", "f"))

df <- df %>%
      arrange(Name, Group) %>%
      group_by(Group) %>%
      top_n(2)

df

# A tibble: 2 x 2
# Groups:   Group [1]
  Group Name 
  <dbl> <chr>
1     1 e    
2     1 f 

Ожидаемый результат будет:

df <- df %>%
      arrange(Name, Group) %>%
      group_by(Group) %>%
      top_n(2)
df

      Group Name
1     0    a
2     0    b
3     1    d
4     1    e

Или что-то подобное. Спасибо.

Ответы [ 2 ]

1 голос
/ 09 мая 2020

top_n выбирает верхние n максимальные значения. Кажется, вам нужны максимальные n минимальные значения. Вы можете использовать индекс с отрицательными значениями, чтобы получить это. Кроме того, вам не нужно arrange данные при использовании top_n.

library(dplyr)
df %>% group_by(Group) %>% top_n(-2, Name)


#  Group Name 
#  <dbl> <chr>
#1     0 a    
#2     0 b    
#3     1 e    
#4     1 d    

Другой способ - arrange данных и выбор первых двух строк в каждой группе.

df %>% arrange(Group, Name) %>% group_by(Group) %>% slice(1:2)
0 голосов
/ 09 мая 2020

Мы можем использовать

library(dplyr)
df %>% 
  arrange(Group, Name) %>% 
  group_by(Group) %>% 
  filter(row_number() < 3)
...