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
行中从id10
到id1
的单元格。最可能的选择是id3
,因为其0.7
的值是行中最高的。
我需要一个名为result
的向量,用于存储我选择后的每一行的选择。我目前的计划是:
denom
这显然是过多的工作。在忽略对角线的NA值的同时权重采样的更好方法是什么?
答案 0 :(得分:1)
您可以将apply
与sample
结合使用,从每一行中随机选择一个元素。我们创建一个自定义函数,该函数包装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)