1) base Создайте матрицу значений NA необходимых размеров и затем заполните ее cv
до его длины. Перенесите это и преобразуйте во фрейм данных.
mat <- t(replace(matrix(NA, 6, ceiling(length(cv) / 6)), seq_along(cv), cv))
as.data.frame(mat, stringsAsFactors = FALSE)
2) другое базовое решение Используя cv2
копию cv
, увеличьте ее длину до требуемой, а затем преобразуйте в матрицу. Мы использовали cv2
, чтобы сохранить исходный cv
, но если вы не возражаете добавить NA к концу cv
, вы можете просто использовать его вместо создания cv2
, сокращая код на одну строку (два линии, если мы можем использовать mat
вместо того, чтобы нуждаться во фрейме данных). Это решение избавляет от необходимости использовать транспонирование, используя аргумент byrow
matrix
.
cv2 <- cv
length(cv2) <- 6 * ceiling(length(cv) / 6)
mat <- matrix(cv2,, 6, byrow = TRUE)
as.data.frame(mat, stringsAsFactors = FALSE)
3) базовое решение с использованием ts Этот метод получает индексы строк и столбцов, извлекая их из времен объекта ts
, а не вычисляя измерения с помощью числовых вычислений. Для этого создайте tt
объекта ts
из cv
. tt
сам по себе является ts
объектом, для которого as.integer(tt)
является индексными номерами строк, а cycle(tt)
является индексными номерами столбцов. Наконец, используйте tapply
с этим:
tt <- time(ts(cv, frequency = 6))
mat <- tapply(cv, list(as.integer(tt), cycle(tt)), c)
as.data.frame(mat, stringsAsFactors = FALSE)
4) rollapply Как и (3), этот явно не вычисляет размеры mat
. Он использует rollapply
в пакете zoo с простой функцией, Fill
r, чтобы избежать этого. Функция Fill
возвращает аргумент x
, дополненный символами NA справа, до длины 6.
library(zoo)
Fill <- function(x) { length(x) <- 6; x }
mat <- rollapplyr(cv, 6, by = 6, Fill, align = "left", partial = TRUE)
as.data.frame(mat, stringsAsFactors = FALSE)
Во всех приведенных выше альтернативах пропустите последнюю строку, если в качестве матрицы достаточно 10 * *.