r - 将日期表转换为年份分析格式(书上的月份)
问题描述
我相信我想要的表格被称为“复古分析格式”。
下面是一个可重现的数据集。
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
``
解决方案
我们可以根据它们在数据中出现的顺序重新排列数据,而不是按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
推荐阅读
- css - 在 ng-datepicker 中设置颜色
- java - 在“lambda”和“匿名类”的上下文中理解 Java 中的“lambda 表达式”
- c++ - 使用递归时获取变量的奇怪值
- javascript - 定位多个相似项目组中的事件
- laravel-5.4 - 从 laravel 5.4 中删除 public
- kotlin - 从字符串中删除不必要的部分
- tensorflow - Keras - 训练损失与验证损失
- php - gzencode 的问题
- vba - 为什么我在重新启动 Outlook 后无法使用我的 VBA 代码?
- python - Python:将文本文件转换为数据框时缺少部分