缺少销售数据中的日期

时间:2018-05-03 09:58:22

标签: r

我的某些销售数据存在问题,其中我的日期变量有不规则的“跳跃”,因为有些时候产品在一年中的某些月份没有销售。

例如:

Data        Product     Sales  
01-2016     X           10
02-2016     X           20
06-2016     X           30
01-2016     Y           40
07-2016     Y           50

如何转换此数据,以便将所有日期与所有产品组合在一起?

Data        Product     Sales  
01-2016     X           10
02-2016     X           20
03-2016     X           0
04-2016     X           0
05-2016     X           0
06-2016     X           30
07-2016     X           0
08-2016     X           0
09-2016     X           0
10-2016     X           0
11-2016     X           0
12-2016     X           0
01-2016     Y           40
02-2016     Y           0
03-2016     Y           0
04-2016     Y           0
05-2016     Y           0
06-2016     Y           0
07-2016     Y           50
08-2016     Y           0
09-2016     Y           0
10-2016     Y           0
11-2016     Y           0
12-2016     Y           0

即。插入缺失的观察结果并为Sales变量分配零点?

2 个答案:

答案 0 :(得分:1)

一种选择是使用包padr的函数pad_cust来自定义数据填充。函数pad只会填写可用日期中缺少的日期。

首先我们需要创建一个日期对象,然后只是使用正确函数的问题。

library(padr)

# create date object
df$Data <- as.Date(paste("01-", df$Data, sep = ""), "%d-%m-%Y")

#pad data with custom span option and fill na's with 0
df <- pad_cust(df, span_date("2016", "2017", by = "month"), group = "Product")
df <- fill_by_value(df, value = 0)

df
         Data Product Sales
1  2016-01-01       X    10
2  2016-02-01       X    20
3  2016-03-01       X     0
4  2016-04-01       X     0
5  2016-05-01       X     0
6  2016-06-01       X    30
7  2016-07-01       X     0
8  2016-08-01       X     0
9  2016-09-01       X     0
10 2016-10-01       X     0
11 2016-11-01       X     0
12 2016-12-01       X     0
13 2016-01-01       Y    40
14 2016-02-01       Y     0
15 2016-03-01       Y     0
16 2016-04-01       Y     0
17 2016-05-01       Y     0
18 2016-06-01       Y     0
19 2016-07-01       Y    50
20 2016-08-01       Y     0
21 2016-09-01       Y     0
22 2016-10-01       Y     0
23 2016-11-01       Y     0
24 2016-12-01       Y     0
如果需要,

padr也可以使用magrittr样式,请参阅padr的插图。

答案 1 :(得分:0)

在基础R中(日期格式使其有点麻烦):

max_date <- as.Date("2016-12-01") # must input this (no way of knowing)

d <- read.table(header = T, stringsAsFactors = F, text = "Data            Product     Sales  
01-2016     X           10
02-2016     X           20
06-2016     X           30
01-2016     Y           40
07-2016     Y           50")

min_dates <- as.Date(tapply(as.Date(paste0("01-",d$Data), format = "%d-%m-%Y"),
                            d$Product, min), origin = "1970-01-01")
dates <- lapply(min_dates, function(x) seq(from = x, to = max_date, by = "1 month"))
want <- data.frame("Data" = format(as.Date(unlist(dates), origin = "1970-01-01"), format = "%m-%Y"),
                   "Product" = rep(unique(d$Product), sapply(dates, length)))
want <- merge(want, d, all.x = T, on = c("Data", "Product"))
want$Sales[is.na(want$Sales)] <- 0
want[order(want$Product, want$Data), ]