gpt4 book ai didi

r - Rcpp 中的高效子集化(相当于 R "which"命令)

转载 作者:行者123 更新时间:2023-12-04 12:20:17 25 4
gpt4 key购买 nike

在 Rcpp 中,有各种“Rcpp 糖”命令允许在代码中进行良好的矢量化操作。在下面的代码中,我移动了一个数据框,将其分解为向量,然后使用“ifelse”和“sum”糖命令来计算 x 等于 y 或 y+1 的行上的 v 均值。一切似乎都正常工作。

只是想知道是否有比这更简洁的方法 - 例如相当于给出满足特定条件的索引点的“which”命令? 在 Armadillo 中似乎有一个可用作“查找”的工具,但这意味着使用不兼容的对象类型(您不能同时使用“查找”和“ifelse”)。

关于同一主题,是否有可能让“ifelse”接受复合逻辑条件? 例如,在下面的示例中,indic 的定义由两个“ifelse”命令组成,显然它会更清晰。任何想法将不胜感激。

期待听到您的回复:)

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
#

最佳答案

Rcpp (>= 0.10.0) 实现了 | 两个逻辑糖表达式之间的运算符。所以你可以这样做:

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

关于r - Rcpp 中的高效子集化(相当于 R "which"命令),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11206085/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com