Преобразовать фрейм данных, содержащий столбцы месяц, год и количество, во временные ряды - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть фрейм данных со столбцами month, year, count.

dataset

Теперь, как я могу преобразовать этот фрейм данных во временные ряды (из класса data frame в класс ts).Таким образом, конечный результат должен быть таким:

.

На рисунке выше показан встроенный набор данных AirPassengers R.Я хочу преобразовать свою таблицу в тот же формат.

Я пытался использовать ответ из этого вопроса.Но я не получил правильный ответ.Я также пытался использовать агрегатные функции, но я застрял.

1 Ответ

0 голосов
/ 21 сентября 2018

Поскольку ваши данные разнесены не одинаково во времени, более того, они не отсортированы, и, возможно, при повторении вы должны агрегировать данные, создать фиктивную 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...