Поскольку ваши данные разнесены не одинаково во времени, более того, они не отсортированы, и, возможно, при повторении вы должны агрегировать данные, создать фиктивную data.frame
с одинаково разнесенными данными года-месяца.Затем merge
это с начальным data.frame
и, наконец, преобразование в ts
.Пожалуйста, смотрите код ниже:
library(lubridate)
# simulation data frame
set.seed(123)
n <- 50
df <- data.frame(
month = sample(month.name, n, replace = TRUE),
year = sample(2010:2018, n, replace = TRUE),
count = 100 * abs(rnorm(n))
)
head(df)
# month year count
# 1 April 2010 25.331851
# 2 October 2013 2.854676
# 3 May 2017 4.287046
# 4 November 2011 136.860228
# 5 December 2015 22.577099
# 6 January 2011 151.647060
# transformation to ts-object
df$ymd <- ymd(paste0(df$year, " ", df$month, " ", "1")) # transform to year-month-date format
df3 <- aggregate(count ~ ymd, df, sum ) # aggregate by monthly count
df2 <- data.frame(ymd = seq(ymd("2010-01-01"), ymd("2015-01-01"), by = "months")) # convert to data.frame
df_r <- merge(df2, df3, all.x = TRUE) # merge data.frames (left join)
df_r$count <- ifelse(is.na(df_r$count), 0, df_r$count) # substitute NA's to 0's
ts_r <- ts(df_r$count, freq = 12, start = c(2010, 1), end = c(2018, 12)) # transform to ts
print(ts_r, digits = 3)
Выход:
Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2010 22.049 0.000 0.000 25.332 0.000 203.493 0.000 0.000 0.000 0.000 0.000 70.920
2011 151.647 173.265 114.881 0.000 0.000 0.000 154.875 0.000 102.557 0.000 136.860 0.000
2012 0.000 136.065 0.000 0.000 0.000 0.000 101.858 0.000 0.000 0.000 0.000 0.576
2013 0.000 0.000 0.000 18.130 23.873 54.772 28.477 0.000 70.387 2.855 0.000 205.008
2014 0.000 0.000 0.000 23.570 0.000 0.000 0.000 68.801 0.000 0.000 132.995 0.000
2015 0.000 0.000 0.000 0.000 117.630 0.000 0.000 122.072 230.917 0.000 0.000 60.541
2016 0.000 0.000 0.000 0.000 0.000 0.000 0.000 100.574 0.000 0.000 146.093 0.000
2017 5.300 107.179 263.554 124.820 4.287 0.000 0.000 0.000 0.000 64.438 0.000 0.000
2018 0.000 0.000 43.518 0.000 0.000 0.000 12.385 0.000 0.000 109.684 0.000 0.000