Вот два способа.Первый способ создает 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 ниже.