Число фильтров top20%~80% каждой группы

из исходных данных

fruit price
apple 12
apple 13
apple 14
apple 15
apple 16
banana 3
banana 5
banana 1
banana 4
banana 2

к новым данным

fruit price 
apple 13 
apple 14 
apple 15 
banana 3 
banana 4 
banana 2 

(удалено яблоко 12,16 и банан 1,5)

Спасибо за вашу помощь

Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
1
0
31
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вот подход, использующий tidyverse и базовую функцию R quantile:

library(tidyverse)

df %>% 
  group_by(fruit) %>%
  filter(price > quantile(price, 0.2) & price < quantile(price, 0.8))
#> # A tibble: 6 x 2
#> # Groups:   fruit [2]
#>   fruit  price
#>   <chr>  <int>
#> 1 apple     13
#> 2 apple     14
#> 3 apple     15
#> 4 banana     3
#> 5 banana     4
#> 6 banana     2

Created on 2022-04-09 by the reprex package (v2.0.1)


Данные (взятые из вопроса) в воспроизводимом формате

df <- structure(list(fruit = c("apple", "apple", "apple", "apple", 
"apple", "banana", "banana", "banana", "banana", "banana"), price = c(12L, 
13L, 14L, 15L, 16L, 3L, 5L, 1L, 4L, 2L)), class = "data.frame", row.names = c(NA, 
-10L))

немного по-другому, используя функцию процент_ранга dplyr

library(dplyr)

df_new <-df %>%
  group_by(fruit) %>%
  filter(percent_rank(price) %>% between(0.2,0.8)) %>%
  ungroup()

Это можно упростить до df %>% group_by(fruit) %>% filter(between(percent_rank(price), 0.2, 0.8)).

Martin Gal 09.04.2022 16:16

Спасибо, что указали на это! Я не использовал фильтры в group_by. Это очень полезно.

Joe Erinjeri 09.04.2022 16:19

Комбинация @Allan Cameron и @Joe Erinjeri отвечает:

library(dplyr)

df %>% 
  group_by(fruit) %>% 
  filter(between(price, quantile(price, .2), quantile(price, .8)))
  fruit  price
  <chr>  <int>
1 apple     13
2 apple     14
3 apple     15
4 banana     3
5 banana     4
6 banana     2

Другие вопросы по теме