r - 如何有效地从数字向量中采样

标签 r loops

data <- data.frame(p1 = runif(10, 0, 1), p2 = runif(10, 0, 1), p3 = runif(10, 0, 1))
我想从 (1, 2, 3) 取样基于概率 (p1, p2, p3) .目前,我已经在循环中写了这个
for(i in 1:nrow(data)){
  data$x <- sample(c(1, 2, 3), size = 1, replace = TRUE, prob = c(data$p1[i], data$p2[i], data$p3[i])
}
有没有更有效的方法来做到这一点?随着数据集中行数的增加,这非常慢。

最佳答案

我们可以使用 rowwise这里

library(dplyr)
data %>% 
   rowwise %>%
   mutate(x = sample(c(1, 2, 3), size = 1, replace = TRUE, 
       prob = c_across(matches('^p\\d+$')))) %>% 
   ungroup
-输出
# A tibble: 10 x 4
      p1    p2     p3     x
   <dbl> <dbl>  <dbl> <dbl>
 1 0.297 0.602 0.852      2
 2 0.169 0.892 0.481      3
 3 0.589 0.777 0.384      2
 4 0.553 0.940 0.741      2
 5 0.910 0.414 0.0253     2
 6 0.756 0.131 0.963      1
 7 0.193 0.710 0.795      3
 8 0.424 0.807 0.926      3
 9 0.429 0.868 0.859      3
10 0.765 0.992 0.912      2

或者更有效的方法是使用 dapply来自 collapse
library(collapse)
data$x <- dapply(gvr(data, '^p\\d+$'), MARGIN = 1, FUN = function(x) 
           sample(c(1, 2, 3), size = 1, replace = TRUE, prob = x))

关于r - 如何有效地从数字向量中采样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68786140/

相关文章:

R 公式和结果系数名称

r - 打开shapefile时出错

javascript - 使用 forEach 循环迭代时忽略 JSON 对象内的未定义属性

postgresql - 测量执行 PostgreSQL 查询所需的时间

javascript - 如何缩短重复的 javascript php 代码

r - 在 R 字符串中的第 n 个大写字母之前插入分隔符

替换 data.frame 中的多列值并合并

r - 使用 ggplot2 生成带有移位标签的颜色图例

php - 循环动态值中的表

c - 酒店管理程序中的神秘错误 - C