r - 使用 RcppParallel 分组求和

标签 r rcpp

我编写了一个函数,可以对组中的值进行求和。它采用两个长度相同的向量:vg,并且应返回一个与 g 中的唯一元素长度相同的向量。组被编码为从零开始的整数。使用 Rcpp::sourceCpp 代码可以编译,但从 R 调用时(例如 sg(runif(6),rep(0:1,each = 3)))会返回数字(0)

// [[Rcpp::depends(RcppParallel)]]
#include <Rcpp.h>
#include <RcppParallel.h>
using namespace Rcpp;
using namespace RcppParallel;

struct SumsInGroups: public Worker
{
  const RVector<double> v;
  const RVector<int> g;

  RVector<double> s;

  SumsInGroups(const NumericVector v, const IntegerVector g, NumericVector s): v(v), g(g), s(s) {}
  SumsInGroups(const SumsInGroups& p, Split): v(p.v), g(p.g), s(p.s) {}

  void operator()(std::size_t begin, std::size_t end) {
    for (std::size_t i = begin; i < end; ++i) {
      if (s[g[i]] != s[g[i]]) s[g[i]] = v[i];
      else s[g[i]] += v[i];
    }
  }

  void join(const SumsInGroups& rhs) {
    for(std::size_t i = 0; i < s.length(); i++) {
      s[i] += rhs.s[i];
    }
  }
};

// [[Rcpp::export]]
RVector<double> sg(NumericVector v, IntegerVector g) {
  NumericVector s;
  SumsInGroups p(v, g, s);
  parallelReduce(0, v.length(), p);
  return p.s;
}

我对 RcppParallel 非常陌生,因此欢迎任何意见和建议。

最佳答案

您需要初始化s。我建议用零初始化。这是对我有用的代码。请注意,由于我用零进行初始化,因此不需要您在运算符 () 中进行检查。

#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::depends(RcppParallel)]]
#include <RcppParallel.h>
using namespace Rcpp;
using namespace RcppParallel;

struct SumsInGroups: public Worker
{
    const RVector<double> v;
    const RVector<int> g;

    RVector<double> s;

    SumsInGroups(const NumericVector v, const IntegerVector g, NumericVector s): v(v), g(g), s(s) {}
    SumsInGroups(const SumsInGroups& p, Split): v(p.v), g(p.g), s(p.s) {}

    void operator()(std::size_t begin, std::size_t end) {
        for (std::size_t i = begin; i < end; ++i) {
            s[g[i]] += v[i];
        }
    }

    void join(const SumsInGroups& rhs) {
        for(std::size_t i = 0; i < s.length(); i++) {
            s[i] += rhs.s[i];
        }
    }
};

// [[Rcpp::export]]
RVector<double> sg(NumericVector v, IntegerVector g) {
    NumericVector s(*std::max_element(g.begin(), g.end()) + 1);
    SumsInGroups p(v, g, s);
    parallelReduce(0, v.length(), p);
    return p.s;
}

/*** R
set.seed(101)
o <- runif(15)
i <-sample(0:3,15, rep = TRUE)
sg(o, i)
tapply(o, i, sum)
*/

关于r - 使用 RcppParallel 分组求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31267407/

相关文章:

r - 字符到数字摘要失败

c++ - 在 Rcpp11 下编译失败,找不到 'future'

c++ - Rcpp:字符 vector 大小

R:检查矩阵的每一列中向量的每个元素是否存在的最快方法

r - 将 POSIXct 对象强制转换为 Date 对象

r - 我怎样才能使 xtable 与 aggregate(..., FUN = paste) 一起工作?

r - 查找行出现的次数

r - 在 Rstudio 中解决项目根目录

c++ - ld 找不到 x86_64 架构的 Rcpp 符号

r - 自定义 R 查找共享对象的位置?