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/