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

2024-04-23

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

例如,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))]

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

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

如果您正在选择1:n你可以用sampl.int哪个更快。还apply正在上matrix是比较快的。将两者放入一个函数中psamp甚至更快。

所以,试试这个(我添加了dt[, 1:3]这样添加列后就不会失败):

psamp <- function(x) sample.int(n=3, size=1, prob=x)
dt[, sample :=apply(as.matrix(dt[, 1:3]), 1, psamp)]

为了稍微摆脱apply我们可以Vectorize psamp并使用do.call。另外——如@IRTFM他在回答中建议——我们应该利用.SD symbol.

psampv <- Vectorize(function(p1, p2, p3) sample.int(n=3, size=1, replace=TRUE, prob=c(p1, p2, p3)))
dt[, sample := do.call(psampv, .SD), .SDcols=c('p1','p2','p3')]

正如建议的那样,将性能提高一个数量级以上@Henrik in comments https://stackoverflow.com/questions/73001429/data-table-sample-with-probabilities-stored-in-columns/73008578#comment128946317_73001429我们可以使用Rcpp。我稍微修改了代码这个答案 https://stackoverflow.com/a/59357190/6574038并使用新的Rcpp::sample,这会给出相同的结果base::sample与相同的set.seed.

#include <Rcpp.h>
// [[Rcpp::export]]
Rcpp::IntegerVector sample_matrix1(Rcpp::NumericMatrix x, Rcpp::IntegerVector choice_set) {
  int n = x.nrow();
  Rcpp::IntegerVector result(n);
  for (int i = 0; i < n; ++i) {
    Rcpp::NumericVector z(x(i, Rcpp::_));
    result[i] = Rcpp::sample(choice_set, 1, false, z)[0];
  }
  return result;
}

Rcpp::sourceCpp("sample_matrix1.cpp")

dt[, sample := sample_matrix1(as.matrix(.SD), 1:3), .SDcols=c('p1','p2','p3')] 

基准测试,每次重复 100k*100 次:

Unit: milliseconds
          expr        min         lq       mean     median         uq       max neval cld
      psamp_:= 1195.16708 1259.06558 1327.19581 1311.17878 1349.98905 1515.1187   100   b
     psamp_.SD 1225.90467 1257.37766 1318.74885 1289.27571 1335.07736 1522.3423   100   b
     psamp_set 1181.44985 1256.73204 1320.29317 1301.75657 1335.22009 1491.3870   100   b
 psamp_do.call 1181.93117 1251.45863 1316.23306 1285.85710 1337.06674 1476.8023   100   b
          rcpp   60.73652   67.15291   72.76073   70.47052   73.91629  127.8278   100  a 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

data.table 样本,概率存储在列中 的相关文章

  • R data.frame 从另一个变量选择的变量中获取值,向量化

    我收到的数据包含许多类似的变量 还有一个附加变量指示哪些变量one我真正想要的那些类似的变量 使用循环我可以查找正确的值 但是数据很大 循环很慢 而且看起来这应该是可矢量化的 我只是还没弄清楚怎么做 编辑 所选变量将用作同一数据框中的新变量
  • 使用 Caret 包的测试集的 ROC 曲线

    我正在尝试从测试集上的插入符号中获取最佳模型的 ROC 曲线 我碰到MLeval包似乎很方便 输出非常全面 使用几行代码提供了所有需要的指标和图表 一个很好的例子在这里 https stackoverflow com a 59134729
  • Math.random 生成多少熵?

    我想生成一个非常大的随机数 我不需要这个号码来保证加密安全 因此 我没有使用crypto getRandomValues https developer mozilla org en US docs Web API RandomSource
  • 将复数名词转换为单数名词

    如何使用 R 将复数名词转换为单数名词 我使用 tagPOS 函数来标记每个文本 然后提取所有标记为 NNS 的复数名词 但是如果我想将这些复数名词转换为单数该怎么办 library openNLP library tm acq o lt
  • 向图节点添加标签

    我使用 visnetwork 库制作了下图 library tidyverse library igraph set seed 123 n 15 data data frame tibble d paste 1 n relations da
  • R data.table %like% 带有逻辑 AND

    我正在尝试构建一个闪亮的搜索引擎应用程序 我根据搜索关键字返回 data table DT lt data table field c A B C A C D A D A B A D B C F B D K DT field like A
  • 提取“|”之前的字符串[复制]

    这个问题在这里已经有答案了 我有一个数据集 其中一列如下所示 ABC DEF GHI ABCD EFG HIJK ABCDE FGHI JKL DEF GHIJ KLM GHI JKLM NO PQRS BCDE FGHI JKL 等等 我
  • Shiny + downloadHandler + Openxlsx 不生成xlsx文件

    我试图通过 Openxlsx 包生成一个 xlsx 文件 其中包含文件内的反应名称和标头 输入变量为 ASL 1 和 Year 1 要保存在文件中的对象是反应表 tab 1 它是由应用程序生成的 没有任何问题 但是当我尝试下载它时 浏览器
  • 使用rvest或httr登录网页上的非标准表单

    我正在尝试使用 rvest 来抓取需要在表单上输入电子邮件 密码登录的网页 rm list ls library rvest Trying to sign into a form using email password url lt ht
  • Javascript:typeof表示“函数”,但它不能作为函数调用

    这次我对 Javascript 真的很困惑 var x Array prototype concat call typeof x function x Uncaught TypeError x is not a function 这里到底发
  • R中的神经网络包出现大错误

    我正在尝试弄清楚如何使神经网络包发挥作用 我用我创建的数据及其结果 大约 50 行数据和三列 第四列是我想要的结果 它是通过简单的数学执行 如对其他三列求和 得出的 进行了一些测试 到目前为止一切顺利 然后我决定将这个包应用到真实数据上 我
  • 在 R 中每小时获取在线数据

    我想获取天文台每小时更新预报的数据 我的一次性数据提取代码如下 library RCurl web lt getURL http www hko gov hk contente htm web lt unlist strsplit web
  • 对 git Push 运行单元测试,对 Pull 请求运行集成测试

    在构建 R 包时 我们使用 testthat 来编写测试 我们有 2 个文件 特定包的测试文件 特异性R 我们用它来确保所有包继续一起工作并且总体结果良好 整体R 当前 当我们推送到 github 或通过 Travis 创建 PR 时 都会
  • JAGS 中的柯西先验

    我正在使用 rJAGS 构建多级贝叶斯模型 并且我想为我的几个参数指定柯西先验 有没有办法在 JAGS 中做到这一点 或者我需要切换到 STAN 吗 我的 JAGS 模型如下 我想更换dnorm柯西分布 但 JAGS 找不到标准R柯西分布
  • 将行从 0 折叠到 0

    对于这样的数据集 Incident ID date product INCFI0000029582 2014 09 25 08 39 45 foo INCFI0000029582 2014 09 25 08 39 48 bar INCFI0
  • 如何将表格与森林图对齐(ggplot2)

    我是 R 新手 创建了一个森林 区间图 并在图旁边包含了一个表格 其中包含我的置信区间和风险比 我的问题是 RR 和 CI 与绘图上的水平网格线不完全对齐 我尝试使用此处所示的拼凑解决方案 但这似乎对我不起作用 grid arrange 更
  • 在单个图中获取 geom_hex 中的观测值 (Shiny)

    我正在尝试创建一个十六进制的交互式图 用户可以单击给定的十六进制 并接收分组在该单击的十六进制中的原始数据帧的所有观察结果的列表 下面是一个 MWE 看起来非常接近我的目标 我正在使用 Shiny hexbin 和 ggplotly app
  • 在闪亮的应用程序中选择文件夹或文件夹目录

    我在使用闪亮时遇到问题 我想选择保存我要在应用程序中使用的所有文件的文件夹 方法是 1 将工作目录设置为该文件夹路径 或 2 将此文件夹内的所有 csv 数据上传到我的应用程序以进行进一步处理 1 我找到了shinyFiles包 但它非常非
  • 用任意数量的空格分割字符串

    我有以下字符串 1 10012 CAB UNCH CAB 我想按间隙分割该字符串 但间隙的空格数量是可变的 有没有办法使用strsplit 函数来分割这个字符串并返回一个包含 8 个元素的向量 该向量已删除所有间隙 一行代码是首选 只需使用
  • 将多个文件读取到多个数据框中

    在d 文件夹中 我有很多Stata文件 例如data aa 1 dta data aa 2 dta data aa 3 dta data bb 1 dta data bb 2 dta data bb 3 dta data cc 1 dta

随机推荐