r - 如何在 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))
解决方案
推荐阅读
- java - 如何使用 .yaml 文件向 AWS Lambda 函数添加策略?
- react-native - 当 Redux 状态更改时,React Native 未安装的屏幕呈现
- tableau-api - Tableau - 双引号
- django - 与 DJango Simple SSO 一起使用的 CORS 问题
- flutter - GridView底部溢出4907像素
- spring-boot - 两种助焊剂组合操作太慢。我应该如何重构它?
- python - 使用存储在 bash 文件脚本中的参数调用 bash 函数会在 Jupyter 笔记本中产生 CalledProcessError
- ios - 如何让我的图像占据整个图像视图?
- javascript - 视图函数没有被执行
- python - Pyarmor 'utf-8' 编解码器无法解码位置 1 中的字节 0xe2:无效的继续字节