【问题标题】:Generate random number with different probabilities for each line in R为R中的每一行生成具有不同概率的随机数
【发布时间】:2020-07-08 14:37:58
【问题描述】:

我想为 data.frame 中的每一行生成一个从 1 到 4 的随机数 u。但是,每条线的概率不同,这些概率存储在变量 p00、p10、p01、p11 中。这意味着 1 的概率是 p00,2 p01 等。我的 data.frame 中有 406611 行。 data01 包含变量 p00、p10、p01、p11。

我正在做以下事情

data02 <- data01 %>%
mutate (u = sample(x=c(1:4), size=406611, replace = T, prob=c(p00, p10, p01, p11))

但是我收到以下错误:

Error in sample.int(length(x), size, replace, prob) :
incorrect number of probabilities.

如果我这样做(只是为了尝试),我不会收到任何错误:

data02 <- data01 %>%
mutate (u = sample(x=c(1:4), size=406611, replace = T, prob=c(0.25, 0.25, 0.25, 0.25))

为什么这不起作用?如何生成数字?

【问题讨论】:

    标签: r random


    【解决方案1】:

    问题是您将 4 个向量传递给 sampleprobs 参数(整个列 p00、p10、p01 和 p11),但 sample 没有以这种方式向量化,只需要单个概率向量。

    您需要编写一个在probs 上矢量化的sample 版本。像这样的:

    vec_sample <- function(A, B, C, D)
    {
      do.call("c", lapply(seq_along(A), function(i)
      {
        sample(1:4, 1, replace = TRUE, prob=c(A[i], B[i], C[i], D[i]))
      }))
    }
    

    所以你的代码会这样工作:

    data02 <- data01 %>% mutate(u = vec_sample(p00, p10, p01, p11))
    

    【讨论】:

    • 非常感谢艾伦的帮助!!你是对的。但是,我需要在示例函数中包含“size = 1”,否则它会生成 4 个值,但我只需要一个。再次感谢你!!!
    【解决方案2】:

    另一个方便的选项是 pmap 循环遍历行并将 'p00' 到 'p11' 列中的值用作prob 中的向量

    library(dplyr)
    library(purrr)
    data01 %>%
           mutate(u = pmap_int(select(., p00, p10, p01, p11),
                      ~sample(1:4, 1, prob = c(...))))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-11
      • 2015-03-26
      • 1970-01-01
      • 1970-01-01
      • 2011-03-07
      • 1970-01-01
      • 2012-12-04
      相关资源
      最近更新 更多