Рассчитать промежуточные итоги в R-кадре данных для определенного диапазона значений в столбце - PullRequest
0 голосов
/ 01 июля 2018

У меня есть фрейм данных df, который имеет следующую структуру:

NEW_UPC         IRI_KEY     WEEK      DOLLARS
13000016961     272568      1220      3.29
13000016961     272568      1221      3.29
13000016961     272568      1222      3.29
13000016961     272568      1223      9.87
13000016962     272568      1224      3.29
13000016961     272568      1224      9.87
13000016962     272568      1225      3.29
13000016961     272568      1225      9.87
13000016962     272568      1226      3.29
13000016961     272568      1226      9.87
13000016961     272568      1227      9.87
13000016961     272568      1228      3.29
13000016963     272568      1228      3.29
13000016963     272568      1229      3.29
13000016962     272568      1230      3.29
13000016961     272568      1230      3.29
13000016963     272568      1230      13.16
13000016962     272568      1231      3.29
13000016963     272568      1231      9.87
21600016430     272568      1231      17.43
13000016962     272568      1232      9.87

Я пытаюсь получить сумму DOLLARS за первые 12 недель для каждой комбинации NEW_UPC - IRI_KEY. Я попробовал следующий код:

df %>% 
  group_by(NEW_UPC,IRI_KEY) %>% 
  mutate(START = min(WEEK), END = max(WEEK)) %>% ungroup() %>%
  group_by(NEW_UPC,IRI_KEY) %>%
  summarise(Sales = case_when(WEEK<=(START+12) ~ sum(DOLLARS)))

Но я получил следующее сообщение об ошибке:

Error in summarise_impl(.data, dots) : 
Column `Sales` must be length 1 (a summary value), not 8

Что я здесь не так делаю?

РЕДАКТИРОВАНИЕ: значения в столбце Sales изменены на реальные итоги, чтобы избежать путаницы в комментарии.

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

NEW_UPC         IRI_KEY     Sales
13000016961     272568      65.8
13000016962     272568      26.3
13000016963     272568      29.6
21600016430     272568      17.4

Обратите внимание, что значения в столбце Sales выше - это просто случайные числа, которые я указал, чтобы показать структуру вывода. Кроме того, если NEW_UPC имеет значения DOLLARS, превышающие 12 недель от START, я хотел бы получить сумму только за первые 12 недель. Таким образом, столбец Sales должен возвращать общее количество за первые 12 недель с START. С другой стороны, если NEW_UPC имеет значения DOLLARS в течение менее 12 недель с START, то Sales должно возвращать итоговое значение за этот период.

1 Ответ

0 голосов
/ 01 июля 2018

Вы почти готовы к решению. Вы можете отсортировать данные по WEEK, а затем top (head) 12 предоставит вам данные за первые 12 недель. Вы можете попробовать как:

library(dplyr)
df %>% 
  group_by(NEW_UPC,IRI_KEY) %>%
  arrange(WEEK) %>%
  summarise(Sales = sum(head(DOLLARS,12)))

# # A tibble: 4 x 3
# # Groups: NEW_UPC [?]
#       NEW_UPC IRI_KEY Sales
#         <dbl>   <int> <dbl>
# 1 13000016961  272568  65.8
# 2 13000016962  272568  26.3
# 3 13000016963  272568  29.6
# 4 21600016430  272568  17.4

Данные:

df <- read.table(text="
NEW_UPC         IRI_KEY     WEEK      DOLLARS
13000016961     272568      1220      3.29
13000016961     272568      1221      3.29
13000016961     272568      1222      3.29
13000016961     272568      1223      9.87
13000016962     272568      1224      3.29
13000016961     272568      1224      9.87
13000016962     272568      1225      3.29
13000016961     272568      1225      9.87
13000016962     272568      1226      3.29
13000016961     272568      1226      9.87
13000016961     272568      1227      9.87
13000016961     272568      1228      3.29
13000016963     272568      1228      3.29
13000016963     272568      1229      3.29
13000016962     272568      1230      3.29
13000016961     272568      1230      3.29
13000016963     272568      1230      13.16
13000016962     272568      1231      3.29
13000016963     272568      1231      9.87
21600016430     272568      1231      17.43
13000016962     272568      1232      9.87",
header = TRUE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...