Логические И и ИЛИ выбранные строки / столбцы в R, без создания временной копии? - PullRequest
0 голосов
/ 24 мая 2018

У меня очень большая матрица, полная булевых ИСТИНА и ЛОЖЕЙ.Мне нужно проверить определенные комбинации столбцов, чтобы найти строки, в которых либо все указанные столбцы имеют значение true, либо (в некоторых случаях) любой из указанных столбцов имеет значение true.

Я могу сделать это с помощью apply () и всех():

> toymat <- matrix(sample(c(F,T),50,rep=T),5,10)
> toymat[,c(1,5,6)]
      [,1]  [,2]  [,3]
[1,]  TRUE FALSE FALSE
[2,] FALSE FALSE  TRUE
[3,]  TRUE FALSE FALSE
[4,]  TRUE  TRUE FALSE
[5,] FALSE FALSE  TRUE

> apply(toymat[, c(1,5,6)],1,all)
[1] FALSE FALSE FALSE FALSE FALSE

Но если я вызываю apply с функцией, которая изменяет значение, кажется, что она передается по значению, а не по ссылке.Другими словами, он создает временную копию «toymat [, c (1,5,6)]» для запуска применения apply (что было бы нежелательно, поскольку фактическая матрица огромна, и код будет делать это много раз)..

Есть ли способ, которым я могу И или ИЛИ вместе произвольное количество выбранных столбцов или выбранных строк без создания временной копии?

1 Ответ

0 голосов
/ 25 мая 2018

Это идеальный вариант использования для Rcpp.Просто используйте:

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
IntegerVector rowsums_bool(const LogicalMatrix& x,
                           const IntegerVector& ind_col) {

  int i, j, j2, n = x.nrow(), m = ind_col.size();
  IntegerVector res(n);      

  for (j = 0; j < m; j++) {
    j2 = ind_col[j] - 1;
    for (i = 0; i < n; i++) {
      if (x(i, j2)) res[i]++;
    } 
  }

  return res;
}

/*** R
toymat <- matrix(sample(c(F,T),50,rep=T),5,10)
toymat[,c(1,5,6)]
(tmp <- rowsums_bool(toymat, c(1,5,6)))
tmp == 3  ## ALL
tmp != 0  ## ANY
*/
...