4

Rcpp には、コード内で優れたベクトル化された操作を許可するさまざまな「Rcpp sugar」コマンドがあります。以下のコードでは、データ フレームを横切って移動し、それをベクトルに分割してから、"ifelse" および "sum" シュガー コマンドを使用して、x が y または y+1 に等しい行の v の平均を計算します。すべてが正しく機能しているようです。

これよりもきちんとした方法があるかどうか疑問に思っています-たとえば、特定の条件を満たすインデックスポイントを与える「which」コマンドに相当するものはありますか? Armadillo には "find" という機能があるようですが、それは互換性のないオブジェクト タイプを使用することを意味します ("find" と "ifelse" を一緒に使用することはできません)。

同じトピックで、「ifelse」で複合論理条件を受け入れることは可能ですか? たとえば、以下の例では、indic の定義が 2 つの「ifelse」コマンドで構成されており、明らかに 1 つにしたほうがすっきりします。どんな考えでも大歓迎です。

回答をお待ちしております:)

require(Rcpp)
require(inline)

set.seed(42)
df = data.frame(x = rpois(1000,3), y = rpois(1000,3), v = rnorm(1000),
                stringsAsFactors=FALSE)

myfunc1 = cxxfunction(
    signature(DF = "data.frame"),
    plugin = "Rcpp",
    body = '
            using namespace Rcpp;
            DataFrame df(DF);
            IntegerVector x = df["x"];
            IntegerVector y = df["y"];
            NumericVector v = df["v"];

            LogicalVector indic = ifelse(x==y,true,ifelse(x==y+1,true,false));
            double subsum = sum(ifelse(indic,v,0));
            int subsize = sum(indic);
            double mn = ((subsize>0) ? subsum/subsize : 0.0);

            return(Rcpp::List::create(_["subsize"] = subsize, 
                                      _["submean"] = mn
                                     ));
            '
            )

myfunc1(df)

### OUTPUT:
# 
# $subsize
# [1] 300
# 
# $submean
# [1] 0.1091555
# 
4

1 に答える 1

3

Rcpp (>= 0.10.0) は|を実装します。2 つの論理的な砂糖式の間の演算子。したがって、次のことができます。

require( Rcpp )

cppFunction( code = '
List subsum( IntegerVector x, IntegerVector y, NumericVector v){
    using namespace Rcpp ;

    LogicalVector indic  = (x==y) | (x==y+1) ;
    int subsize          = sum(indic) ;
    double submean       = subsize == 0 ? 0.0 : sum(ifelse(indic,v,0)) / subsize ;

    return List::create( _["subsize"] = subsize, _["submean"] = submean ) ;
}
' )
subsum( rpois(1000,3), rpois(1000,3), rnorm(1000) )
# $subsize
# [1] 320
# 
# $submean
# [1] -0.05708866
于 2012-11-01T08:10:45.723 に答える