Преобразование временного ряда в кадр данных и обратно - PullRequest
16 голосов
/ 17 марта 2011

Вывод временного ряда выглядит как фрейм данных:

ts(rnorm(12*5, 17, 8), start=c(1981,1), frequency = 12)

       Jan       Feb       Mar       Apr       May       Jun       Jul     ...
1981 14.064085 21.664250 14.800249 -5.773095 16.477470  1.129674 16.747669 ...
1982 23.973620 17.851890 21.387944 28.451552 24.177141 25.212271 19.123179 ...
1983 19.801210 11.523906  8.103132  9.382778  4.614325 21.751529  9.540851 ...
1984 15.394517 21.021790 23.115453 12.685093 -2.209352 28.318686 10.159940 ...
1985 20.708447 13.095117 32.815273  9.393895 19.551045 24.847337 18.703991 ...

Было бы удобно преобразовать его во фрейм данных со столбцами Jan, Feb, Mar ... и строками 1981, 1982, ... и затем обратно. Какой самый элегантный способ сделать это?

Ответы [ 2 ]

21 голосов
/ 17 марта 2011

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

# create test data
set.seed(123)
tt <- ts(rnorm(12*5, 17, 8), start=c(1981,1), frequency = 12)

1) matrix .Это решение требует, чтобы у нас были целые годы подряд

dmn <- list(month.abb, unique(floor(time(tt))))
as.data.frame(t(matrix(tt, 12, dimnames = dmn)))

Если мы не заботимся о хороших именах, это просто as.data.frame(t(matrix(tt, 12))).

Мы могли бы заменить строку dmn<- наследующая более простая строка с использованием комментария @ thelatemail:

dmn <- dimnames(.preformat.ts(tt))

2) tapply .Более общее решение с использованием tapply выглядит следующим образом:

Month <-  factor(cycle(tt), levels = 1:12, labels = month.abb)
tapply(tt, list(year = floor(time(tt)), month = Month), c)

Примечание: Для инвертирования этого предположения X - это любое из решений выше.Затем попробуйте:

ts(c(t(X)), start = 1981, freq = 12)

Обновление

Улучшение мотивировано комментариями @latemail ниже.

1 голос
/ 12 октября 2018

Пример с набором данных AirPassengers:

Сделайте данные доступными и проверьте их тип:

data(AirPassengers)
class(AirPassengers)

Преобразование временных рядов во фрейм данных:

df <- data.frame(AirPassengers, year = trunc(time(AirPassengers)), 
month = month.abb[cycle(AirPassengers)])

Повторите создание объекта временного ряда:

tsData = ts(df$AirPassengers, start = c(1949,1), end = c(1960,12), frequency = 12)

Составьте график результатов, чтобы обеспечить правильное выполнение:

components.ts = decompose(tsData)
plot(components.ts)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...