为R中的每一行生成具有不同概率的随机数

  • 本文关键字:随机数 概率 一行 r random
  • 更新时间 :
  • 英文 :


我想为数据帧中的每一行生成一个从1到4的随机数u。但是,每一行的概率不同,这些概率存储在变量p00、p10、p01、p11中。这意味着1的概率是p00,2的概率是p1等等。我的数据帧中有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))

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

问题是,将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))

另一个方便的选项是pmap在行上循环,并将"p00"到"p11"列中的值用作prob中的矢量

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

最新更新