3

我有一个非常大的二进制 big.matrix 以及一个类分配向量(与 big.matrix 的行数相同的长度)。

我希望能够遍历 big.matrix 的每一列并为每个 fisher.test 输出 p 值。

使用普通的矩阵对象,我可以执行以下操作,但是将我的 big.matrix 转换为矩阵需要超过 5 GB 的内存。

p.value <- unlist(
    lapply(
        lapply(as.data.table(binarymatrix),
               fisher.test,
               y = class
        ), function(x) x$p.value
    )
)

如何在不转换为矩阵对象的情况下做到这一点?据我了解,访问 big.matrix 的元素需要 C++ 代码,但我对此一点也不熟悉。

这里它展示了如何在 Rcpp Rcpp 中执行fisher.test:Rcpp 中是否有实现 fisher.test()但我不确定如何将矩阵的每一列输入到其中。

一个例子 big.matrix 看起来像

library(bigmemory)
matrix <- matrix(sample(0:1, 100 * 10000, replace = TRUE), 100 , 10000)
bigmatrix <- as.big.matrix(matrix)

我的类变量看起来像:

class <- sample( LETTERS[1:2], 100, replace=TRUE)

谢谢!

编辑:

这是我现在拥有的 Rcpp 代码。如果有人可以帮助我找出问题所在,我将不胜感激。

// [[Rcpp::depends(RcppEigen, RcppArmadillo, bigmemory, BH)]]
#include <RcppArmadillo.h>
#include <RcppEigen.h>
#include <bigmemory/BigMatrix.h>
#include <bigmemory/MatrixAccessor.hpp>

using namespace Rcpp;
using namespace arma;
using namespace Eigen;
using namespace std;

// [[Rcpp::plugins(cpp11)]]

// [[Rcpp::export]]
ListOf<IntegerVector> AccessVector(SEXP pBigMat, int j, vector<int> status) {
  XPtr<BigMatrix> xpMat(pBigMat);
  MatrixAccessor<int> macc(*xpMat);
  
  int n = xpMat->nrow();
  
  // Bigmemory
  cout << "Bigmemory:"; 
  for (int i = 0; i < n; i++) {
    cout << macc[j][i] << ' ';
  }
  cout << endl;    
  
  // STD VECTOR
  vector<int> stdvec(macc[j], macc[j] + n); 

  // Obtain environment containing function
  Rcpp::Environment base("package:stats"); 
  
  // Make function callable from C++
  Rcpp::Function fisher_test = base["fisher.test"];    
  
  // Call the function and receive its list output
  Rcpp::List test_out = fisher_test(Rcpp::_["x"] = stdvec, Rcpp::_["y"] = status);
  
  // Return test object in list structure
  return test_out;
}

理想情况下,我希望能够遍历 C++ 本身中的每一列,并将 p 值输出到 R。

4

0 回答 0