簡體   English   中英

有沒有一種更有效的內存使用方式,可以使用combn從R中的其他每一列中減去每一列?

[英]Is there a more memory-efficient way to use combn to subtract every column from every other column in R?

我正在嘗試從具有13125列和90行的大型R data.table中的每一列中減去每一列。

我正在跟蹤先前的問題,該問題針對較小尺寸的data.tables解決此問題( 從R data.table中的其他列中減去每一列 )。

我的問題是我當前內存不足以生成列組合的data.table結果(似乎需要59.0GB)。

我的問題是,是否有一種更高效的內存計算方式,可以使用combin或大型數據集的另一個函數來計算列差異?

我一直在使用的代碼是:

# I have a data.table of 13125 columns and 90 rows, called data. 

# use combn to generate all possible pairwise column combinations (column + column),
# then within this apply a function to subtract the column value from its paired column value.
# this is done for each row, to produce a new datatable called res.

res <- as.data.table(combn(colnames(data), 2, function(x) data[[x[1]]] - data[[x[2]]]))

# take the pairwise column combinations and paste the pairing as the new column name

colnames(res) <- combn(colnames(data), 2, paste, collapse="_")

如果這個問題太相似,因此我認為是重復的,我深表歉意。 我將非常感謝您提供有關如何針對我的數據規模提高此代碼效率的任何建議。

根據OP關於在區分列之后進行下一步操作的評論,如果在計算過程中也對列的總數求平方並求和,則將使內存更緊湊,這樣結果將只有一個包含13,125個元素的向量,而不是存儲13,125 * 90 * 90個數字相減值。 一種快速可行的方法是使用RcppArmadillo

colpairs.cpp (絕不是唯一的實現):

// [[Rcpp::depends(RcppArmadillo)]]
#include <RcppArmadillo.h>
using namespace Rcpp;
using namespace arma;

// [[Rcpp::export]]
rowvec colpairs(mat Z) {
    unsigned int i, j, k = Z.n_cols;
    colvec vi, vj, y;
    rowvec res(k);

    for (i=0; i<k; i++) {
        vi = Z.col(i);
        res[i] = 0;
        for (j=0; j<k; j++) {
            vj = Z.col(j);
            y = vi - vj;
            res[i] += as_scalar(y.t() * y);
        }
    }

    return res;
}

在R中:

library(Rcpp)
library(RcppArmadillo)
sourceCpp("colpairs.cpp")

# #use a small matrix to check results
# set.seed(0L)
# nc <- 3; nr <- 3; M <- matrix(rnorm(nr*nc), ncol=nc)
# c(sum((M[,1]-M[,2])^2 + (M[,1]-M[,3])^2), sum((M[,3]-M[,2])^2 + (M[,2]-M[,3])^2), sum((M[,3]-M[,1])^2 + (M[,2]-M[,3])^2))
# colpairs(M)

set.seed(0L)
nc <- 13125
nr <- 90
M <- matrix(rnorm(nr*nc), ncol=nc)
colpairs(M)

unc 輸出:

[1] 2105845 2303591 2480945 2052415 2743199 2475948 2195874 2122436 2317515  .....

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM