Выберите разное количество top_n для разных групп, используя dplyr - PullRequest
2 голосов
/ 15 марта 2020

У меня есть следующий кадр данных. Я хочу предпочесть dplyr, чтобы решить эту проблему. Для каждой зоны я хочу минимум два значения. Значение> 4.0 является предпочтительным.

Следовательно, для зоны 10 все значения (будучи> 4.0) сохраняются. Для зоны 20 выбраны два верхних значения. Аналогично для зоны 30.

zone <- c(rep(10,4), rep(20, 4), rep(30, 4))
set.seed(1)
value <- c(4.5,4.3,4.6, 5,5, rep(3,7)) + round(rnorm(12, sd = 0.1),1)
df <- data.frame(zone, value)
> df
   zone value
1    10   4.4
2    10   4.3
3    10   4.5
4    10   5.2
5    20   5.0
6    20   2.9
7    20   3.0
8    20   3.1
9    30   3.1
10   30   3.0
11   30   3.2
12   30   3.0

Требуемый вывод выглядит следующим образом

> df
   zone value
1    10   4.4
2    10   4.3
3    10   4.5
4    10   5.2
5    20   5.0
6    20   3.1
7    30   3.1
8    30   3.2

Я думал об использовании top_n, но он выбирает один и тот же номер для каждой зоны.

Ответы [ 2 ]

3 голосов
/ 15 марта 2020

Вы можете динамически рассчитать n в top_n

library(dplyr)  
df %>% group_by(zone) %>% top_n(max(sum(value > 4), 2), value)


#   zone value
#  <dbl> <dbl>
#1    10   4.4
#2    10   4.3
#3    10   4.5
#4    10   5.2
#5    20   5  
#6    20   3.1
#7    30   3.1
#8    30   3.2
1 голос
/ 15 марта 2020

может сделать это

library(tidyverse)
df %>% 
  group_by(zone) %>% 
  filter(row_number(-value) <=2 | head(value > 4))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...