我的某些销售数据存在问题,其中我的日期变量有不规则的“跳跃”,因为有些时候产品在一年中的某些月份没有销售。
例如:
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变量分配零点?
答案 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), ]