根据单元格值从矩阵行中采样单元格

时间:2019-09-24 17:25:42

标签: r matrix random sampling

10x10矩阵包含绘制过程中在给定行中选择的任何单元的“似然性”。

        id1 id2 id3 id4 id5 id6 id7 id8 id9 id10
id1     NA  0.5 0.7 0.5 0.5 0.4 0.4 0.4 0.4 0.4
id2     0.5 NA  0.5 0.5 0.5 0.4 0.4 0.4 0.4 0.4
id3     0.7 0.5 NA  0.5 0.5 0.4 0.4 0.4 0.4 0.4
id4     0.5 0.5 0.5 NA  0.5 0.4 0.4 0.4 0.4 0.4
id5     0.5 0.5 0.5 0.5 NA  0.4 0.4 0.4 0.4 0.4
id6     0.4 0.4 0.4 0.4 0.4 NA  0.5 0.7 0.5 0.5
id7     0.4 0.4 0.4 0.4 0.4 0.5 NA  0.5 0.5 0.5
id8     0.4 0.4 0.4 0.4 0.4 0.7 0.5 NA  0.5 0.5
id9     0.4 0.4 0.4 0.4 0.4 0.5 0.5 0.5 NA  0.5
id10    0.4 0.4 0.4 0.4 0.4 0.5 0.5 0.5 0.5 NA

每次绘制均按行进行,选择一个单元格的机会就是该单元格的值除以给定行中所有单元格值的总和。例如,我需要选择id2行中从id10id1的单元格。最可能的选择是id3,因为其0.7的值是行中最高的。

我需要一个名为result的向量,用于存储我选择后的每一行的选择。我目前的计划是:

  1. 跨行求和并将结果存储为向量denom
  2. 为每行生成一个介于0和此总和之间的随机均匀变量
  3. 如果该值在0.0到0.5之间,则第1行中所选的人是id2;如果是0.51-1.20,则所选的人是id3 ...等。

这显然是过多的工作。在忽略对角线的NA值的同时权重采样的更好方法是什么?

2 个答案:

答案 0 :(得分:1)

您可以将applysample结合使用,从每一行中随机选择一个元素。我们创建一个自定义函数,该函数包装sample来处理对角线上的缺失值并使用正确的权重。一件方便的事是,在用na.omit删除丢失的值之后,所得向量仍然具有名称,因此我们可以使用prob参数使用相应的概率作为权重对名称进行采样。

mat <- as.matrix(read.table(
text = "id1 id2 id3 id4 id5 id6 id7 id8 id9 id10
id1  NA  0.5 0.7 0.5 0.5 0.4 0.4 0.4 0.4 0.4
id2  0.5 NA  0.5 0.5 0.5 0.4 0.4 0.4 0.4 0.4
id3  0.7 0.5 NA  0.5 0.5 0.4 0.4 0.4 0.4 0.4
id4  0.5 0.5 0.5 NA  0.5 0.4 0.4 0.4 0.4 0.4
id5  0.5 0.5 0.5 0.5 NA  0.4 0.4 0.4 0.4 0.4
id6  0.4 0.4 0.4 0.4 0.4 NA  0.5 0.7 0.5 0.5
id7  0.4 0.4 0.4 0.4 0.4 0.5 NA  0.5 0.5 0.5
id8  0.4 0.4 0.4 0.4 0.4 0.7 0.5 NA  0.5 0.5
id9  0.4 0.4 0.4 0.4 0.4 0.5 0.5 0.5 NA  0.5
id10 0.4 0.4 0.4 0.4 0.4 0.5 0.5 0.5 0.5 NA"
))

foo <- function(row) {
  no_na <- na.omit(row)
  sample(x = names(no_na), size = 1, prob = no_na)
}

result <- apply(mat, 1, foo)
result
#>    id1    id2    id3    id4    id5    id6    id7    id8    id9   id10 
#>  "id2"  "id9"  "id4"  "id2"  "id3"  "id8"  "id8" "id10"  "id3"  "id7"

reprex package(v0.3.0)于2019-09-24创建

答案 1 :(得分:0)

相关问题