从 big.matrix 中删除只有一个值的列

标签 r r-bigmemory

我有一个非常大的二进制矩阵,存储为 big.matrix 以节省内存(否则超过 2 GB - 500 万列和 100 行)。

r <- 100
c <- 10000
m4 <- matrix(sample(0:1,r*c, replace=TRUE),r,c)
m4 <- cbind(m4, 1)
m4 <- as.big.matrix(m4)

我需要删除只有一个唯一值的每一列(在本例中,只有 0 或只有 1)。由于列数较多,我希望能够并行执行此操作。

如何在将数据压缩为 big.matrix 的同时实现此目的?我可以将其转换为 df 并在列上循环查找唯一值的数量,但这需要太多 RAM。

谢谢!

最佳答案

将其放入 .cpp 文件中并使用 Rcpp::sourceCpp 获取它:

// [[Rcpp::depends(BH, bigmemory)]]
#include <bigmemory/MatrixAccessor.hpp>
#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
LogicalVector to_keep(SEXP bm_addr) {

  XPtr<BigMatrix> xptr(bm_addr);
  MatrixAccessor<double> macc(*xptr);

  size_t n = macc.nrow();
  size_t m = macc.ncol();

  double first_val;

  LogicalVector keep(m, false);

  for (size_t j = 0; j < m; j++) {
    first_val = macc[j][0];
    for (size_t i = 1; i < n; i++) {
      if (macc[j][i] != first_val) {
        keep[j] = true;
        break;
      }
    }
  }

  return keep;
}

/*** R
library(bigmemory)
r <- 100
c <- 10000
m4 <- matrix(sample(0:1,r*c, replace=TRUE),r,c)
m4 <- cbind(m4, 1)
m4 <- as.big.matrix(m4)
m4[, 1] <- 1
m4[, 2] <- 0

keep <- to_keep(m4@address)
m4.keep <- deepcopy(m4, cols = which(keep))
*/

关于从 big.matrix 中删除只有一个值的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49959260/

相关文章:

r - big.matrix 文档中不可重现的示例(应用)

滚动 PCA 并绘制主成分的比例方差

r - 将多列拆分成行

r - 计算 big.matrix 的平均值

r - 在 R 中计算 big.matrix 的对角线

r - bigmemory 和带有文件支持的 friend 的示例

r - 链接到 blogdown 中的另一篇文章

r - 是否可以在 pdf 中使用 R knitr::kable 生成的表格中添加垂直线?

r - 在环境中分配列表属性

R: big.matrix 乘法