我有一个非常大的矩阵,里面装满了布尔的真和假。我需要检查某些列组合以查找所有指定列都为真或(在某些情况下(任何指定列为真的行。
我可以使用 apply(( 和 all(( 来做到这一点:
> 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(]"的临时副本来运行应用程序(这是不可取的,因为实际的矩阵很大,代码会这样做很多次(。
有没有办法我可以在不创建临时副本的情况下将任意数量的选定列或选定行放在一起
?这是 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
*/