我有一个n×n矩阵,其中的值在[0,1]之间,并且每列都有相同的值.

这些值表示矩阵的每个元素取值True或False的概率.

我正在寻找一种快速的方法,基于每个元素的独立随机样本,将具有概率的矩阵转换为具有真/假值的矩阵.

目前,此代码生成我想要的内容(Tf_Matrix):

n <- 10
p_true <- runif(n,0,1)

p_matrix <- matrix(p_true,n,n, byrow=T)
tf_matrix <- matrix(F, n,n)

for(i in 1:nrow(tf_matrix)) {
    
    for(j in 1:ncol(tf_matrix)) {
        
        tf_matrix[i,j] <- sample(c(T,F), size = 1, prob = c(p_matrix[i,j], 1-p_matrix[i,j]))
        
    }
}

然而,这可能非常慢,因为它使用两个for循环,并且我需要为大型矩阵一遍又一遍地做这件事.

有没有办法让这件事更有效率(也就是尽可能快)?

推荐答案

sample(c(T, F), size = 1, prob = x)等于runif(1) < x.但在runif<中,随着<的矢量化,我们可以微不足道地进行扩展:

set.seed(42) ## set seed for reproducibility
n <- 5       ## smaller example is easier to see
p_true <- runif(n,0,1)
p_matrix <- matrix(p_true,n,n, byrow=T)
p_matrix
#          [,1]      [,2]      [,3]      [,4]      [,5]
# [1,] 0.914806 0.9370754 0.2861395 0.8304476 0.6417455
# [2,] 0.914806 0.9370754 0.2861395 0.8304476 0.6417455
# [3,] 0.914806 0.9370754 0.2861395 0.8304476 0.6417455
# [4,] 0.914806 0.9370754 0.2861395 0.8304476 0.6417455
# [5,] 0.914806 0.9370754 0.2861395 0.8304476 0.6417455

tf_matrix = runif(n * n) < p_matrix
tf_matrix
#      [,1] [,2]  [,3]  [,4]  [,5]
# [1,] TRUE TRUE FALSE FALSE  TRUE
# [2,] TRUE TRUE FALSE  TRUE  TRUE
# [3,] TRUE TRUE  TRUE FALSE FALSE
# [4,] TRUE TRUE FALSE FALSE  TRUE
# [5,] TRUE TRUE FALSE  TRUE FALSE

R相关问答推荐

在R中使用GG Plot时如何 suppress 等值线图中的彩色条

是否有任何解决方案可以优化VSCode中RScript的图形绘制?

如何在ggplot 2 geom_segment图表中将UTC转换为EET?

高质量地将R格式的图表从Word中输出

通过绘图 Select 线串几何体并为其着色

R的GG平行坐标图中的排序变量

根据收件箱中的特定值提取列名

selectInput不返回ALL,并将因子转换为shiny 的数字

错误:非常长的R行中出现意外符号

如何自定义3D散点图的图例顺序?

为什么当用osmdata映射R时会得到相邻状态?

计算满足R中条件的连续列

LOF中的插图短文字幕

计算数据帧中指定值之前的行数,仅基于每行之后的future 行,单位为r

KM估计的差异:SvyKm与带权重的调查

R:如果为NA,则根据条件,使用列名模式将缺少的值替换为另一列中的值

R中的类别比较

按组使用dummy r获取高于标准的行的平均值

R中的Desolve:返回的导数数错误

使用LAG和dplyr执行计算,以便按行和按组迭代