Альтернатива циклу for, который создает матрицу сдвинутых строк

В следующем коде используется матрица 10 x 2 с индексами и ценами в качестве столбцов. Затем он сдвигает переменную Price m раз и создает матрицу размером 10 x m со смещенными переменными. Наконец, он добавляет эту матрицу к исходному фрейму данных. Это шаблон, который я запускаю в большой базе данных. Если возможно, я бы хотел найти альтернативный подход к циклу for, чтобы улучшить производительность и скорость кода.

#Data
df <- data.frame(
  Index = c(1:10),
  Price = c(1221, 1220, 1220, 1217, 1216,  1218 , 1216, 1216, 1217, 1220))

#Define rowShift function
rowShift <- function(x, shiftLen = 1L) { 
  r <- (1L + shiftLen):(length(x) + shiftLen)
  r[r<1] <- NA
  return(x[r])  }

#Pre-allocate variables/matrix for shifted rows
n <- NROW(df$Price)
m <- 5 #how many rows to shift
FwdMatrix <- matrix(nrow = n, ncol = m)
dimnames(FwdMatrix) <- list(rownames(FwdMatrix, do.NULL = FALSE, prefix = ""),colnames(FwdMatrix, do.NULL = FALSE, prefix = "Fwd"))

#Loop to create shifted rows variables
for(i in 1:m) { FwdMatrix[,i ] <- rowShift(df$Price,-i) }
Index <- df$Index
FwdMatrixBis <- cbind(FwdMatrix, Index)
FwdDF <- data.frame(FwdMatrixBis) 
df2 <- merge(df, FwdDF, by = "Index", sort = FALSE)

1 ответ

Решение

Вы могли бы использовать shift от data.table пакет:

library(data.table)
m <- 5
FwdMatrix <- matrix(unlist(shift(df$Price, 1L:m)), ncol=m)
Другие вопросы по тегам