4

私は次のRコードを持っています:

CutMatrix <- FullMatrix[, colSums( FullMatrix[-1,] != FullMatrix[-nrow( FullMatrix ), ] ) > 0]

これは、行列 (FullMatrix) を取り、FullMatrix 内のどの列に複数の一意の値を持つ列があるかを見つけることによって CutMatrix を作成します。そのため、同じ値を持つすべての列が削除されます。Rcpp を使用して大規模な行列でこれを高速化できるかどうか疑問に思っていますが、これを行うための最良の方法がわかりません。これを簡単に行うための甘い方法があるかどうか (たとえば、列をループして一意の値の数) または、STL からより複雑なものを使用する必要がある場合。

次のようなものが始まりだと思ったかもしれません(私はうまくいきませんでした)-R関数のcolSumsブレースの間で操作を実行しようとしていますが、サブセット化しているとは思いません機能しないため、マトリックスが正しくなります。

src <- '
//Convert the inputted character matrix of DNA sequences an Rcpp class.
Rcpp::CharacterMatrix mymatrix(inmatrix);

//Get the number of columns and rows in the matrix
int ncolumns = mymatrix.ncol();
int numrows = mymatrix.nrow();

//Get the dimension names
Rcpp::List dimnames = mymatrix.attr("dimnames");

Rcpp::CharacterMatrix vec1 = mymatrix(Range(1,numrows),_);
Rcpp::CharacterMatrix vec2 = mymatrix(Range(0,numrows-1),_); 
'

uniqueMatrix <- cxxfunction(signature(inmatrix="character"), src, plugin="Rcpp")

ありがとう、ベン。

4

1 に答える 1

2

これは、 R をサブセット化するために使用できる値が1 つだけのすべての列の aLogicalVectorを返します。FALSEuniquematrix

require( Rcpp )
cppFunction('
  LogicalVector unq_mat( CharacterMatrix x ){

  int nc = x.ncol() ;
  LogicalVector out(nc);

  for( int i=0; i < nc; i++ ) {
    out[i] = unique( x(_,i) ).size() != 1 ;
    }
  return out;
}'
)

こんな風に使える...

#  Generate toy data
set.seed(1)
mat <- matrix( as.character(c(rep(1,5),sample(3,15,repl=TRUE),rep(5,5))),5)
     [,1] [,2] [,3] [,4] [,5]
[1,] "1"  "1"  "3"  "1"  "5" 
[2,] "1"  "2"  "3"  "1"  "5" 
[3,] "1"  "2"  "2"  "3"  "5" 
[4,] "1"  "3"  "2"  "2"  "5" 
[5,] "1"  "1"  "1"  "3"  "5"

mat[ , unq_mat(mat) ]
     [,1] [,2] [,3]
[1,] "1"  "3"  "1" 
[2,] "2"  "3"  "1" 
[3,] "2"  "2"  "3" 
[4,] "3"  "2"  "2" 
[5,] "1"  "1"  "3" 

いくつかの基本的なベンチマーク...

applyR <- function(y) { y[ , apply( y , 2 , function(x) length( unique(x) ) != 1L ) ] }
rcpp <- function(x) x[ , unq_mat(x) ]

require(microbenchmark)
microbenchmark( applyR(mat) , rcpp(mat) )
#Unit: microseconds
#        expr    min      lq median     uq    max neval
# applyR(mat) 131.94 134.737 136.31 139.29 268.07   100
#   rcpp(mat)   4.20   4.901   7.70   8.05  13.30   100
于 2013-11-01T14:10:26.500 に答える