Сгруппируйте предметы и найдите лучшие n% от каждой группы - PullRequest
0 голосов
/ 06 мая 2019

У меня есть данные в следующем формате.Я должен найти сумму значений верхних 25% в каждой группе, сгруппированных по идентификатору.

Если число, соответствующее верхним 25% в группе, является дробью, приведите данные для ceil (большее число) этой дроби

ID  Value
3   10
3   83
1   13
2   62
2   26
3   63
3   37
1   17
3   22
3   41
3   45
2   65
3   63
1   45
2   71
3   61
2   97
2   89
3   72
3   16
1   22

Пока я смог получитьверхние n строк с использованием приведенного ниже кода, я не нашел способ получить верхние n% в каждой группе

p2<-group_by(data, ID) %>%
mutate(rank = rank(desc(Value))) %>%
arrange(rank) %>%
filter(rank <= 3)

Ожидаемый результат выглядит примерно так.В данных 4 строки с идентификатором 1 - верхние 25% означают 1 строку.

Есть 6 строк с ID 2 - ceil (0,25 * 6) - 2, поэтому верхние 2 строки.Аналогично, для ID 3 есть 11 строк - ceil (0.25 * 11) - это верхние 3 строки под ID 3.

Пожалуйста, дайте мне знать, как это получить!

ID  Value
1   45
2   97
2   89
3   83
3   72
3   65

1 Ответ

6 голосов
/ 06 мая 2019

Мы можем arrange кадр данных в порядке убывания Value, а затем slice количество строк на основе соотношения для каждой группы.

library(dplyr)

df %>%
  arrange(desc(Value)) %>%
  group_by(ID) %>%
  slice(1:ceiling(0.25 * n()))

#     ID Value
#  <int> <int>
#1     1    45
#2     2    97
#3     2    89
#4     3    83
#5     3    72
#6     3    63

Мы также можем сделать это в базе R. Сначала order строк, основанных на Value, split строк, основанных на ID, а затем выберите лучшие n строки из каждой группы.

new_df <- df[order(df$Value, decreasing = TRUE), ]
new_df[unlist(Map(head, split(1:nrow(new_df), new_df$ID), 
                  ceiling(table(new_df$ID) * 0.25))), ]

#   ID Value
#14  1    45
#17  2    97
#18  2    89
#2   3    83
#19  3    72
#6   3    63
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...