首页 > 解决方案 > 为R中的每一行生成具有不同概率的随机数

问题描述

我想为我的 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))

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

标签: rrandom

解决方案


问题是您将 4 个向量传递给(整个列 p00、p10、p01 和 p11)的probs参数,但没有以这种方式向量化,并且只采用一个概率向量。samplesample

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

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))

推荐阅读