агрегирование по сумме в соответствии с условием последовательности в R - PullRequest
0 голосов
/ 06 декабря 2018

Скажите, вот мои данные

     mydat=structure(list(ItemRelation = c(11629L, 11629L, 11629L, 11629L, 
11629L, 11629L, 11629L, 11629L, 11629L, 11629L, 11629L, 11629L, 
11629L, 11629L, 11629L, 11629L, 11629L, 11629L, 11629L, 11629L, 
11629L, 11630L, 11630L, 11630L, 11630L, 11630L, 11630L, 11630L, 
11630L, 11630L, 11630L, 11630L, 11630L), exp_date_days = c(5L, 
5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 
5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L
), CustomerName = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("ТС", "ТС1"), class = "factor"), 
    DocumentNum = c(11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 
    11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 
    11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L
    ), IsPromo = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L), CalendarYear = c(2018L, 2018L, 
    2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 
    2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 
    2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 
    2018L, 2018L, 2018L, 2018L), diff = 1:33), .Names = c("ItemRelation", 
"exp_date_days", "CustomerName", "DocumentNum", "IsPromo", "CalendarYear", 
"diff"), class = "data.frame", row.names = c(NA, -33L))

У "Испромо" только порядок 0-1-0 !!!

Мне нужно для каждой группы ItemRelation+CustomerName+DocumentNum+CalendarYear агрегированные данные по сумме согласноусловие.

  1. Если группа по exp_date_days имеет значение <= 5, то столбец diff должен быть агрегирован по сумме только по 10 нулям, что после одной категории испромо.Если нули меньше 10, то агрегировать по максимальному количеству нулей. </p>

  2. Если группировка по exp_date_days имеет значение> 5, тогда столбец diff должен агрегировать по сумме только по 15 нулям, чтопосле одной категории испромо.Если нули меньше 15, то агрегировать по максимальному количеству нулей.

Итак, выведите в этом примере

ItemRelation    CustomerName    DocumentNum CalendarYear    diff
11629                  ТС          11               2018    126
11630                  ТС          11               2018     285

Как это сделать, используя dplyr или data.table?

Редактировать

ItemRelation    exp_date_days   CustomerName    DocumentNum IsPromo CalendarYear    diff
11629   5   ТС  11  0   2018    1
11629   5   ТС  11  0   2018    2
11629   5   ТС  11  0   2018    3
11629   5   ТС  11  0   2018    4
11629   5   ТС  11  0   2018    5
11629   5   ТС  11  0   2018    6
11629   5   ТС  11  0   2018    7
11629   5   ТС  11  0   2018    8
11629   5   ТС  11  0   2018    9
11629   5   ТС  11  0   2018    10
11629   5   ТС  11  0   2018    11
11629   5   ТС  11  0   2018    12
11629   5   ТС  11  1   2018    13
11629   5   ТС  11  1   2018    14
**11629 5   ТС  11  0   2018    15
11629   5   ТС  11  0   2018    16
11629   5   ТС  11  0   2018    17
11629   5   ТС  11  0   2018    18
11629   5   ТС  11  0   2018    19
11629   5   ТС  11  0   2018    20
11629   5   ТС  11  0   2018    21** (sum 126)

Редактировать2

ItemRelation    exp_date_days   CustomerName    DocumentNum IsPromo CalendarYear    diff
11630   6   ТС1 11  0   2018    22
11630   6   ТС1 11  1   2018    23
**11630 6   ТС1 11  0   2018    24
11630   6   ТС1 11  0   2018    25
11630   6   ТС1 11  0   2018    26
11630   6   ТС1 11  0   2018    27
11630   6   ТС1 11  0   2018    28
11630   6   ТС1 11  0   2018    29
11630   6   ТС1 11  0   2018    30
11630   6   ТС1 11  0   2018    31
11630   6   ТС1 11  0   2018    32
11630   6   ТС1 11  0   2018    33** (285)

1 Ответ

0 голосов
/ 06 декабря 2018

Мы могли бы сделать filter после group_by и затем получить sum из столбца 'diff'

library(dplyr)
mydat %>% 
  group_by(ItemRelation, CustomerName, DocumentNum, CalendarYear) %>% 
  filter(cumsum(c(FALSE, diff(IsPromo == 1) < 0)) == 1) %>% 
  filter(if(all(exp_date_days < 5)) row_number() <= 10 else row_number() <= 15) %>%
  summarise(diff = sum(diff))
# A tibble: 2 x 5
# Groups:   ItemRelation, CustomerName, DocumentNum [?]
#  ItemRelation CustomerName DocumentNum CalendarYear  diff
#         <int> <fct>              <int>        <int> <int>
#1        11629 ТС                    11         2018   126
#2        11630 ТС1                   11         2018   285
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...