Альтернатива циклу 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)