2016-04-16 74 views
1

以下代碼使用10 x 2矩陣,Index和Price爲列。然後它將變量Price轉換m次,並用移位的變量創建一個10 x m的矩陣。最後,它將該矩陣附加到原始數據幀。這是我在大型數據庫上運行的模板。如果可能的話,我希望找到for循環的另一種方法來提高代碼的性能/速度。替代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) 
+0

類似'FwdMatrix < - 矩陣(不公開(data.table ::移(DF $價格,1L:5L))的NcoI = 5)'? – lukeA

+0

地獄是!很棒,謝謝。想要將其作爲回覆,以便我可以檢查問題的答案? – Krug

+0

另外,你知道是否有可能在代碼中輸入「m」而不是「5」作爲輸入嗎?嘗試時收到錯誤消息。 – Krug

回答

1

你可以使用shiftdata.table包:

library(data.table) 
m <- 5 
FwdMatrix <- matrix(unlist(shift(df$Price, 1L:m)), ncol=m)