Преобразование временного ряда в кадр данных и обратно
Выход временного ряда выглядит как кадр данных:
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,... и затем обратно. Какой самый элегантный способ сделать это?
Ответы
Ответ 1
Вот два способа. Первый способ создает dimnames для матрицы, которая должна быть создана, а затем выводит данные в матрицу, транспонирует их и преобразует в кадр данных. Второй способ создает список, состоящий из переменных года и месяца, и использует его для последующего преобразования в фрейм данных и добавления имен.
# create test data
set.seed(123)
tt <- ts(rnorm(12*5, 17, 8), start=c(1981,1), frequency = 12)
1) матрица. Это решение требует, чтобы у нас были целые годы подряд
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
состоит в следующем:
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 ниже.
Ответ 2
Пример с набором данных 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)
Ответ 3
Попробуйте пакет "tsbox"
ts = ts(rnorm(12*5, 17, 8), start=c(1981,1), frequency = 12)
df = ts_df(ts)
str(df)
data.frame: 60 obs. of 2 variables:
time : Date, format: "1981-01-01" "1981-02-01"
value: num 23.15 22.77 5.1 1.05 13.87