R: преобразование объекта xts или zoo во фрейм данных

Каков простой способ принуждения данных временных рядов к фрейму данных в формате, в котором результирующие данные представляют собой сводку оригинала?

Это могут быть некоторые примерные данные, хранящиеся в xts или объекте zoo:

t,                  V1
"2010-12-03 12:00", 10.0
"2010-11-04 12:00", 10.0
"2010-10-05 12:00", 10.0
"2010-09-06 12:00", 10.0
...and so on, monthly data for many years.

и я хотел бы преобразовать его во фрейм данных, например:

year, month, V1
2010, 12,    a descriptive statistic calculated of that month's data
2010, 11,    ...
2010, 10,    ...
2010, 9,     ...

Причина, по которой я спрашиваю об этом, заключается в том, что я хочу построить ежемесячные рассчитанные сводные данные на одном и том же графике. Я могу сделать это довольно легко для данных в последнем формате, но не нашел метода построения графика для формата временных рядов.

Например, у меня могут быть данные о температуре за несколько лет, измеренные в дневном интервале, и я хотел бы построить кривые для среднемесячных температур для каждого года на том же графике. Я не понял, как это сделать, используя данные в формате xts, и подходит ли это даже для целей форматирования данных xts / zoo, которые, кажется, всегда содержат информацию о году.


person user442446    schedule 06.12.2010    source источник
comment
вы знаете, что никогда не поздно принять некоторые ответы как лучший ответ   -  person JD Long    schedule 17.02.2011


Ответы (2)


Пожалуйста, предоставьте образец данных для работы, и я постараюсь дать менее общий ответ. В основном вы можете использовать apply.monthly для вычисления сводной статистики по вашему объекту xts. Затем вы можете преобразовать индекс в yearmon и преобразовать объект xts в data.frame.

x <- xts(rnorm(50), Sys.Date()+1:50)
mthlySumm <- apply.monthly(x, mean)
index(mthlySumm) <- as.yearmon(index(mthlySumm))
Data <- as.data.frame(mthlySumm)
person Joshua Ulrich    schedule 06.12.2010
comment
И вы можете вывести год и месяц с помощью format строками типа as.numeric(format(index(x), "%Y")) и as.numeric(format(index(x), "%m")) - person Richard Herron; 06.12.2010
comment
Это было очень полезно, спасибо. Мне не хватало функции index (), а также функции format (). Теперь с моими данными поиграться стало проще. - person user442446; 05.01.2011
comment
@ user442446, если он ответил на ваш вопрос, вы должны принять его как лучший ответ. Вы также должны сделать это для других 5 заданных вами вопросов, поскольку вы не отметили лучших ответов ни на один из ваших вопросов. - person Joshua Ulrich; 05.01.2011
comment
Джошуа Ульрих дал очень полезный ответ на аналогичный вопрос о преобразовании зоопарка / кадра данных в stackoverflow.com/questions/14064097, в котором есть Преимущество примеров данных и вывода. - person Silverfish; 01.11.2013

Вот решение, использующее пакет tidyquant, который включает функции as_xts() для приведения фреймов данных к объектам xts и as_tibble() для приведения объектов xts к tibbles ("аккуратные" фреймы данных).

Воссоздание ваших данных:

> data_xts
           V1
2010-09-06 10
2010-10-05 10
2010-11-04 10
2010-12-03 10

Используйте as_tibble() для преобразования в тибл. preserve_row_names = TRUE добавляет столбец с именем "row.names" с индексом xts в качестве класса символов. rename и mutate используются для очистки дат. Результатом будет таблица с датами и значениями.

> data_df <- data_xts %>%
     as_tibble(preserve_row_names = TRUE) %>%
     rename(date = row.names) %>%
     mutate(date = as_date(date))
> data_df
# A tibble: 4 × 2
        date    V1
      <date> <dbl>
1 2010-09-06    10
2 2010-10-05    10
3 2010-11-04    10
4 2010-12-03    10

Вы можете пойти дальше и добавить другие поля, такие как день, месяц и год, с помощью функции mutate.

> data_df %>%
     mutate(day   = day(date),
            month = month(date),
            year  = year(date))
# A tibble: 4 × 5
        date    V1   day month  year
      <date> <dbl> <int> <dbl> <dbl>
1 2010-09-06    10     6     9  2010
2 2010-10-05    10     5    10  2010
3 2010-11-04    10     4    11  2010
4 2010-12-03    10     3    12  2010
person Matt Dancho    schedule 02.03.2017