我在R中使用了一个相当大的文档术语矩阵(~280,000个术语),我想知道是否有一种有效的方法为我的每个原始术语创建滞后变量。
以下示例给出了一个包含三个术语的文档术语矩阵。这适用于这样的玩具示例,但对我的数据来说是不可能的。
关于滞后结构的快速说明:我正在探索任何特定术语的外观是否会随着时间的推移而具有一定程度的累积性,尽管会逐渐减少。
dtm <- data.frame(revenue=c(1,2,3,3,5,6), up=c(1,1,0,3,1,1), sale=c(0,1,1,0,1,1))
for (i in 1:nrow(dtm)){
if (i >=4){
dtm$revenueLag4days[i] <- dtm$revenue[(i-3):i]%*%c(0.25,0.5,0.75,1)
dtm$upLag4days[i] <- dtm$up[(i-3):i]%*% c(0.25,0.5,0.75,1)
dtm$saleLag4days[i] <- dtm$sale[(i-3):i]%*% c(0.25,0.5,0.75,1)
} else
dtm$revenueLag4days[i] <- dtm$upLag4days[i] <- dtm$saleLag4days[i] <- NA
}
是否有可能以功能的方式为文档术语矩阵(~280,000个术语)重写它?
答案 0 :(得分:0)
使用if
语句并在循环中创建向量会使您慢慢减慢。下面的循环会更快,您可以使用并行处理(例如foreach
)
# Create a data.frame to store your results in
ans <- data.frame(matrix(NA, nrow = nrow(dtm), ncol = ncol(dtm)))
# Give it the same column names as dtm
colnames(ans) <- colnames(dtm)
# Transpose dtm for matrix math
tdtm <- t(dtm)
# Create your row vector
mult_mat <- matrix(c(0.25, 0.5, 0.75, 1), ncol = 1, nrow = 4)
# Loop through your matrix
for(i in 4:nrow(dtm)){
ans[i,] <- tdtm[,(i-3):i] %*% mult_mat
}
对于具有280,000列和100行的矩阵,此循环花费约52秒。