相关疑难解决方法(0)

RcppArmadillo 的 sample() 更新 R 后不明确

我通常使用一个简短的 Rcpp 函数,该函数将一个矩阵作为输入,其中每行包含 K 个总和为 1 的概率。然后该函数为每一行随机采样 1 到 K 之间的整数,对应于提供的概率。这是函数:

// [[Rcpp::depends(RcppArmadillo)]]
#include <RcppArmadilloExtensions/sample.h>

using namespace Rcpp;

// [[Rcpp::export]]
IntegerVector sample_matrix(NumericMatrix x, IntegerVector choice_set) {
  int n = x.nrow();
  IntegerVector result(n);
  for ( int i = 0; i < n; ++i ) {
    result[i] = RcppArmadillo::sample(choice_set, 1, false, x(i, _))[0];
  }
  return result;
}
Run Code Online (Sandbox Code Playgroud)

我最近更新了 R 和所有软件包。现在我不能再编译这个函数了。我不清楚原因。跑步

library(Rcpp)
library(RcppArmadillo)
Rcpp::sourceCpp("sample_matrix.cpp")
Run Code Online (Sandbox Code Playgroud)

引发以下错误:

error: call of overloaded 'sample(Rcpp::IntegerVector&, int, bool, Rcpp::Matrix<14>::Row)' is ambiguous
Run Code Online (Sandbox Code Playgroud)

这基本上告诉我,我的电话RcppArmadillo::sample()是模棱两可的。任何人都可以启发我为什么会这样吗?

r rcpp rcpparmadillo

9
推荐指数
1
解决办法
177
查看次数

data.table 样本,概率存储在列中

我有一个数据表,其中存储在列中的离散分布的概率。

例如,dt <- data.table(p1 = c(0.5, 0.25, 0.1), p2 = c(0.25, 0.5, 0.1), p3 = c(0.25, 0.25, 0.8))

我想创建一个新的随机变量列,使用同一行中的概率进行采样。在 data.table 语法中,我想象它的工作方式如下:

dt[, sample := sample(1:3, 1, prob = c(p1, p2, p3))]
Run Code Online (Sandbox Code Playgroud)

如果有一个类似于“pmin”和“pmax”的“psample”函数,那么这将起作用。我能够使用 apply 来完成这项工作,缺点是对于我的真实数据集,这需要比我想要的更长的时间。有没有办法使用 data.table 来完成这项工作?下面给出应用解决方案。

dt[, sample := apply(dt, 1, function(x) sample(1:3, 1, prob = x[c('p1', 'p2', 'p3')]))]
Run Code Online (Sandbox Code Playgroud)

random r function data.table rowwise

5
推荐指数
1
解决办法
528
查看次数

标签 统计

r ×2

data.table ×1

function ×1

random ×1

rcpp ×1

rcpparmadillo ×1

rowwise ×1