Мои данные находятся в формате data.frame, таком как данные примера:
data <-
structure(list(Article = structure(c(1L, 1L, 3L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 2L, 1L, 2L, 1L
), .Label = c("10004", "10006", "10007"), class = "factor"),
Demand = c(26L, 780L, 2L, 181L, 228L, 214L, 219L, 291L, 104L,
72L, 155L, 237L, 182L, 148L, 52L, 227L, 2L, 355L, 2L, 432L,
1L, 156L), Week = c("2013-W01", "2013-W01", "2013-W01", "2013-W01",
"2013-W01", "2013-W02", "2013-W02", "2013-W02", "2013-W02",
"2013-W02", "2013-W03", "2013-W03", "2013-W03", "2013-W03",
"2013-W03", "2013-W04", "2013-W04", "2013-W04", "2013-W04",
"2013-W04", "2013-W04", "2013-W04")), .Names = c("Article",
"Demand", "Week"), class = "data.frame", row.names = c(NA, -22L))
Я хотел бы обобщить колонку спроса за неделю и статью. Для этого я использую:
library(dplyr)
WeekSums <-
data %>%
group_by(Article, Week) %>%
summarize(
WeekDemand = sum(Demand)
)
Но поскольку некоторые статьи не были проданы в определенные недели, количество строк на статью отличается (только недели с продажами показаны в DataSrams WeekSums). Как я могу настроить свои данные так, чтобы каждая статья имела одинаковое количество строк (по одной на каждую неделю), в том числе недели с требованием 0?
Результат должен выглядеть следующим образом:
Article Week WeekDemand
1 10004 2013-W01 1215
2 10004 2013-W02 900
3 10004 2013-W03 774
4 10004 2013-W04 1170
5 10006 2013-W01 0
6 10006 2013-W02 0
7 10006 2013-W03 0
8 10006 2013-W04 5
9 10007 2013-W01 2
10 10007 2013-W02 0
11 10007 2013-W03 0
12 10007 2013-W04 0
Я пробовал
WeekSums %>%
group_by(Article) %>%
if(n()< 4) rep(rbind(c(Article,NA,NA)), 4 - n() )
но это не работает. В моем первоначальном подходе я решил эту проблему, объединив фрейм данных недельных чисел 1-4 с моим файлом rawdata для каждой статьи. Таким образом, у меня есть 4 недели (строки) для каждой статьи, но реализация с циклом for очень неэффективна, и поэтому я пытаюсь сделать то же самое с dplyr (или любым другим более эффективным пакетом/функцией). Любые предложения будут высоко оценены!