首页 > 解决方案 > 如何在 R 中执行大型矩阵和向量运算时避免存储对象

问题描述

如下代码所示,我们在数据帧 DF5 中对三个变量 V1、V2 和 V3 执行矩阵运算。虽然我们需要的最终结果是分别用于 V1、V2 和 V3 的 matV1、matV2 和 matV3,但我们在使用代码时存储了大量对象。当 DF5 包含一百万行数据时,此过程需要大量时间。我们如何在存储最少数量的对象的同时执行以下操作?

install.packages("data.table")
library(data.table)
# STEP 1
#V1
setDT(DF5)
numvec <- max(DF5[,k])
dlV1 <- lapply(1:numvec, function(i) DF5[k == i, sort(V1)])
dmatV1 <- CJ(x=1:numvec, y=1:numvec)[, .(z = sum(findInterval(dlV1[[y]],dlV1[[x]]))), .(x,y)]
matV1 <- as.matrix(dcast(dmatV1, x~y, value.var = 'z')[, -'x'])
diag(matV1) <- 0
#V2
dlV2 <- lapply(1:numvec, function(i) DF5[k == i, sort(V2)])
dmatV2 <- CJ(x=1:numvec, y=1:numvec)[, .(z = sum(findInterval(dlV2[[y]],dlV2[[x]]))), .(x,y)]
matV2 <- as.matrix(dcast(dmatV2, x~y, value.var = 'z')[, -'x'])
diag(matV2) <- 0
#V3
dlV3 <- lapply(1:numvec, function(i) DF5[k == i, sort(V3)])
dmatV3 <- CJ(x=1:numvec, y=1:numvec)[, .(z = sum(findInterval(dlV3[[y]],dlV3[[x]]))), .(x,y)]
matV3 <- as.matrix(dcast(dmatV3, x~y, value.var = 'z')[, -'x'])
diag(matV3) <- 0

#STEP 2: Divide
matV12<-sweep(matV1, 2, 10, FUN = '/')
matV22<-sweep(matV2, 2, 10, FUN = '/')
matV32<-sweep(matV3, 2, 10, FUN = '/')

Lists <- list(matV12, matV22, matV32)
E<-Reduce("*", Lists)
    
#STEP 3
RESULT<-data.frame(rowSums(E))

标签: rmatrixvectorlapply

解决方案


推荐阅读