我有一个非常大的二进制 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。