从R dataframe创建每周累计总计

时间:2018-04-21 02:54:15

标签: r database group-by

我有一个数据框架,可以在各个市场推出产品周。这是数据帧的快照。

    Prod_ID        Market_Name         START_WEEK
    11044913000    PHOENIX, AZ         1397
    11044913000    WEST TEX/NEW MEX    1206
    11159402003    PORTLAND,OR         1188
    11159402003    SEATTLE/TACOMA      1188
    11159402003    SPOKANE             1195
    11159410010    PORTLAND,OR         1186
    11159410010    SALT LAKE CITY      1190
    11159410010    SEATTLE/TACOMA      1186
    11159410010    SPOKANE             1187
    11159410010    WEST TEX/NEW MEX    1197
    11159410014    PORTLAND,OR         1198
    11159410014    SEATTLE/TACOMA      1239

我想创建另一个数据框,这将为我提供每个Prod_ID的累计总数,产品在前6周每周推出一次。对于上面的数据片段,输出应该是这样的。

    Prod_ID        Week1    Week2    Week3    Week4    Week5    Week6
    11044913000    1        1        1        1        1        1
    11159402003    2        2        2        2        2        2
    11159410010    2        3        3        3        4        4
    11159410014    1        1        1        1        1        1

为了便于显示,我只显示输出直到第6周,但我需要追踪到第12周才能满足我的需要。周由我的数据集中的4位数字表示,不是日期格式。请注意,并非所有产品的开始周都相同,因此我需要从Prod_ID变量推断START_WEEK的最早周。然后确定接下来的6周,以产生每周推出的市场总数。

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

我想我理解你的问题。这是我的镜头。这个解决方案有几个阶段。

第一步是计算自打开以来每个int max; int maxIndex = 1; cin >> max; for (int i = 2; i <= 5; i++) { int n; cin >> n; if (n > max) { max = n; maxIndex = i; } } cout << maxIndex; 的周数和周数的市场累计总和。这是通过以下代码块完成的。

Prod_ID

第二阶段是将df1 <- df %>% group_by(Prod_ID, START_WEEK) %>% count() %>% arrange(Prod_ID, START_WEEK) %>% ungroup() %>% group_by(Prod_ID) %>% mutate(tot_market = cumsum(n)) %>% ungroup() %>% group_by(Prod_ID) %>% mutate(min_START_WEEK = min(START_WEEK)) %>% mutate(week = START_WEEK - min_START_WEEK + 1) df1 # # A tibble: 10 x 6 # # Groups: Prod_ID [4] # Prod_ID START_WEEK n tot_market min_START_WEEK week # <dbl> <int> <int> <int> <dbl> <dbl> # 1 11044913000. 1206 1 1 1206. 1. # 2 11044913000. 1397 1 2 1206. 192. # 3 11159402003. 1188 2 2 1188. 1. # 4 11159402003. 1195 1 3 1188. 8. # 5 11159410010. 1186 2 2 1186. 1. # 6 11159410010. 1187 1 3 1186. 2. # 7 11159410010. 1190 1 4 1186. 5. # 8 11159410010. 1197 1 5 1186. 12. # 9 11159410014. 1198 1 1 1198. 1. # 10 11159410014. 1239 1 2 1198. 42. week扩展为Prod_ID中的最大周数。

week

第三阶段是通过合并df2 <- expand.grid(min(df1$week):max(df1$week), unique(df1$Prod_ID)) colnames(df2) <- c("week", "Prod_ID") df1并使用df2来填充zoo::locf中的NA来完成的(市场总数) )tot_market前面的值。

Prod_ID