我想为数据帧中的每一行生成一个从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个向量传递给sample
的probs
参数(整列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(...))))