Как выбрать топ-5 на определенную дату в R? - PullRequest
1 голос
/ 03 апреля 2020

Если у меня есть следующие данные:

obs District    ZoneID  Period  SUM_activity
1   Northwestern    Northern: 53A   2019-02-06 - 2019-03-06 4
2   Northwestern    Northern: 53B   2019-02-06 - 2019-03-06 0
3   Northwestern    Northwestern: 61A   2019-02-06 - 2019-03-06 88
4   Northwestern    Northwestern: 61B   2019-02-06 - 2019-03-06 44
5   Northwestern    Northwestern: 61D   2019-02-06 - 2019-03-06 212
6   Northwestern    Northwestern: 62A   2019-02-06 - 2019-03-06 38
7   Northwestern    Northwestern: 62B   2019-02-06 - 2019-03-06 18
8   Northwestern    Northwestern: 62C   2019-02-06 - 2019-03-06 65
9   Northwestern    Northwestern: 62D   2019-02-06 - 2019-03-06 4
10  Northwestern    Northwestern: 63A   2019-02-06 - 2019-03-06 107
11  Northwestern    Northwestern: 63B   2019-02-06 - 2019-03-06 19
12  Northwestern    Northwestern: 63C   2019-02-06 - 2019-03-06 56
13  Northwestern    Northwestern: 63D   2019-02-06 - 2019-03-06 165
14  Northwestern    Northwestern: DATA  2019-02-06 - 2019-03-06 28
15  Northwestern    Northwestern: DATB  2019-02-06 - 2019-03-06 26
16  Northwestern    Northwestern: DATC  2019-02-06 - 2019-03-06 114
17  Northwestern    Outside Zones 2019-02-06 - 2019-03-06   1501
18  Southern    Outside Zones 2019-02-06 - 2019-03-06   2062
19  Southwestern Outside Zones  2019-02-06 - 2019-03-06 1351

И я группирую эти данные так, чтобы они выглядели следующим образом:

District    2019-02-06 - 2019-03-06
Northwestern    2489
Northern: 53A   4
Northern: 53B   0
Northwestern: 61A   88
Northwestern: 61B   44
Northwestern: 61D   212
Northwestern: 62A   38
Northwestern: 62B   18
Northwestern: 62C   65
Northwestern: 62D   4
Northwestern: 63A   107
Northwestern: 63B   19
Northwestern: 63C   56
Northwestern: 63D   165
Northwestern: DATA  28
Northwestern: DATB  26
Northwestern: DATC  114
Outside Zones 1501
Southern    2062
Outside Zones 2062
Southwestern    1351
Outside Zones 1351

По районам, как бы я составил таблицу в котором было три группы: -сумма активности для 5 верхних зон с точки зрения sum_activity -сумма активности для остальных зон (в основном! = внешняя зона и! = категория 5 лучших) -сумма категории внешней зоны

Эти три группы должны быть созданы на основе суммы до определенного периода (2019-02-06 - 2019-03-06), предполагая, что будет больше диапазонов дат, чем в этой таблице, до и после 2019-02-06 - 2019-03-06.

Вот пример только для Северо-Западного округа:

District    Top 5   Rest of Zones   Outside Zones
Northwestern    686 302 1501

Спасибо.

Ответы [ 2 ]

0 голосов
/ 05 апреля 2020

Хотя использование top_n может работать хорошо, получить «отдых» может быть сложно, особенно если есть связи. В этом случае я создал группирующую переменную (grp), равную 1, если переменная SUM_activity находится в верхних 5, а 0 - в противном случае. Затем я объединил это с теми, у которых ZonedID = "Внешние зоны", чтобы создать 3 группы.

library(dplyr)
library(tidyr)

data %>%
  mutate(Zone=ifelse(ZoneID=="Outside Zones", 1, 0)) %>%
  group_by(District, Period, Zone) %>%
  mutate(grp=factor(+(min_rank(desc(SUM_activity))<=5) + Zone,
    labels=c("Top 5", "Rest of Zones", "Outside Zones"),
    levels=c(1,0,2))) %>%
  group_by(District, Period, grp) %>%
  summarise(n=sum(SUM_activity)) %>%
  pivot_wider(names_from=grp, values_from=n, values_fill=list(n=0))

# A tibble: 3 x 5
# Groups:   District, Period [3]
  District     Period                  `Top 5` `Rest of Zones` `Outside Zones`
  <chr>        <chr>                     <int>           <int>           <int>
1 Northwestern 2019-02-06 - 2019-03-06     686             302            1501
2 Southern     2019-02-06 - 2019-03-06       0               0            2062
3 Southwestern 2019-02-06 - 2019-03-06       0               0            1351

Данные

data <- structure(list(obs = 1:19, District = c("Northwestern", "Northwestern", 
"Northwestern", "Northwestern", "Northwestern", "Northwestern", 
"Northwestern", "Northwestern", "Northwestern", "Northwestern", 
"Northwestern", "Northwestern", "Northwestern", "Northwestern", 
"Northwestern", "Northwestern", "Northwestern", "Southern", "Southwestern"
), ZoneID = c("Northern: 53A", "Northern: 53B", "Northwestern: 61A", 
"Northwestern: 61B", "Northwestern: 61D", "Northwestern: 62A", 
"Northwestern: 62B", "Northwestern: 62C", "Northwestern: 62D", 
"Northwestern: 63A", "Northwestern: 63B", "Northwestern: 63C", 
"Northwestern: 63D", "Northwestern: DATA", "Northwestern: DATB", 
"Northwestern: DATC", "Outside Zones", "Outside Zones", "Outside Zones"
), Period = c("2019-02-06 - 2019-03-06", "2019-02-06 - 2019-03-06", 
"2019-02-06 - 2019-03-06", "2019-02-06 - 2019-03-06", "2019-02-06 - 2019-03-06", 
"2019-02-06 - 2019-03-06", "2019-02-06 - 2019-03-06", "2019-02-06 - 2019-03-06", 
"2019-02-06 - 2019-03-06", "2019-02-06 - 2019-03-06", "2019-02-06 - 2019-03-06", 
"2019-02-06 - 2019-03-06", "2019-02-06 - 2019-03-06", "2019-02-06 - 2019-03-06", 
"2019-02-06 - 2019-03-06", "2019-02-06 - 2019-03-06", "2019-02-06 - 2019-03-06", 
"2019-02-06 - 2019-03-06", "2019-02-06 - 2019-03-06"), SUM_activity = c(4L, 
0L, 88L, 44L, 212L, 38L, 18L, 65L, 4L, 107L, 19L, 56L, 165L, 
28L, 26L, 114L, 1501L, 2062L, 1351L)), class = "data.frame", row.names = c(NA, 
-19L))
0 голосов
/ 03 апреля 2020

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

library(dplyr)
df1 %>%
     group_by(District, Period) %>%
     top_n(5, wt = SUM_activity)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...