首页 > 解决方案 > 将日期表转换为年份分析格式(书上的月份)

问题描述

我相信我想要的表格被称为“复古分析格式”。

下面是一个可重现的数据集。

library(BTYDplus)
txn <- head(BTYDplus::groceryElog,100)

custFirstTxn <- BTYDplus::groceryElog %>% group_by(cust) %>% arrange(cust, date)  %>%
  filter(row_number()==1) #%>%
  #mutate(cohort = tsibble::yearmonth(date))
custFirstTxn$cohort <- tsibble::yearmonth(custFirstTxn$date)

custFirstTxn %>% group_by(cohort) %>% summarise(n()) %>% ungroup()

custFirstTxn <- custFirstTxn %>% ungroup()

mycust <- custFirstTxn %>% group_by(cohort) %>% top_n(n = 6, wt = cust) %>% dplyr::select(-date)

monthlytxn <- BTYDplus::groceryElog %>% 
  mutate(date = date %>% tsibble::yearmonth()) %>%
  group_by(cust, date) %>% tally() %>% 
  filter(cust %in% mycust$cust & date <= tsibble::yearmonth('2006 Jun')) %>% arrange(date)

monthlytxn %>% pivot_wider(names_from = date, values_from = n)

# A tibble: 18 x 7
# Groups:   cust [18]
   cust       2006 Jan   2006 Feb   2006 Mar   2006 Apr   2006 May   2006 Jun
   <fct>      <int>      <int>      <int>      <int>      <int>      <int>
 1 534            1          1         NA         NA         NA          1
 2 535            1         NA         NA         NA         NA          2
 3 536            1         NA          1          1          1          1
 4 537            1         NA          1         NA         NA          1
 5 538            1          2          1          1          2          1
 6 539            1          1         NA         NA         NA         NA
 7 1018          NA          1         NA         NA         NA         NA
 8 1019          NA          1         NA          1          1         NA
 9 1020          NA          1          2          3          2          3
10 1021          NA          1          2          1          1          1
11 1022          NA          1          1          2          1         NA
12 1023          NA          1          1          1         NA         NA
13 1520          NA         NA          1         NA         NA         NA
14 1521          NA         NA          1         NA          1         NA
15 1522          NA         NA          1          1         NA         NA
16 1523          NA         NA          1         NA         NA         NA
17 1524          NA         NA          1          1         NA         NA
18 1525          NA         NA          1          2          1          1

我们注意到,不同的客户群体有不同的群体日期。有些分别在 2006 年 1 月、2006 年 2 月和 2006 年 3 月进行了首次交易。

我想要的是将这些更宽的表格转换为下面。请注意,日期现在不再是每月日期,而是标准化为每个客户的第一个月交易。

# MOB refers to MonthOnBook
# I truncate the other MOB to simplify the view.

   cust        MOB1       MOB2       MOB3       MOB4 
   <fct>      <int>      <int>      <int>      <int>
 1 534            1          1         NA         NA
 2 535            1         NA         NA         NA
 3 536            1         NA          1          1
 4 537            1         NA          1         NA
 5 538            1          2          1          1
 6 539            1          1         NA         NA
 7 1018           1         NA         NA         NA
 8 1019           1         NA          1          1
 9 1020           1          2          3          2
10 1021           1          2          1          1
11 1022           1          1          2          1
12 1023           1          1          1         NA
13 1520           1         NA         NA         NA 
14 1521           1         NA          1         NA 
15 1522           1          1         NA         NA 
16 1523           1         NA         NA         NA 
17 1524           1          1         NA         NA 
18 1525           1          2          1          1 
``

标签: rdplyrdata-transform

解决方案


我们可以根据它们在数据中出现的顺序重新排列数据,而不是按date.

library(dplyr)
library(tidyr)

monthlytxn %>%
  #This should be grouped by cust however data is already 
  #grouped so not doing it again explicitly here.
  mutate(col = row_number()) %>%
  select(-date) %>%
  pivot_wider(names_from = col, values_from = n, names_prefix = 'MOB')


#  cust   MOB1  MOB2  MOB3  MOB4  MOB5  MOB6
#   <fct> <int> <int> <int> <int> <int> <int>
# 1 534       1     1     1    NA    NA    NA
# 2 535       1     2    NA    NA    NA    NA
# 3 536       1     1     1     1     1    NA
# 4 537       1     1     1    NA    NA    NA
# 5 538       1     2     1     1     2     1
# 6 539       1     1    NA    NA    NA    NA
# 7 1018      1    NA    NA    NA    NA    NA
# 8 1019      1     1     1    NA    NA    NA
# 9 1020      1     2     3     2     3    NA
#10 1021      1     2     1     1     1    NA
#11 1022      1     1     2     1    NA    NA
#12 1023      1     1     1    NA    NA    NA
#13 1520      1    NA    NA    NA    NA    NA
#14 1521      1     1    NA    NA    NA    NA
#15 1522      1     1    NA    NA    NA    NA
#16 1523      1    NA    NA    NA    NA    NA
#17 1524      1     1    NA    NA    NA    NA
#18 1525      1     2     1     1    NA    NA

推荐阅读