根据具有匹配结构的 list/table 中的值随机抽样

Randomly sample based on values in a list/table with matching structure

我在 R 中有一个特定的采样任务,我不知道如何解决。

我有一个 20000x10 的整数索引列表 [1:20000, 1:10] 称为 "index",一个 20000x10 的数字距离列表 [1:20000, 1:10] 称为 "dist" - 这些都存储在一个名为 "x2xx" 的列表中。我有一个单独的 20000x1 数值列表,称为 "y2xx"。我应该补充一点,dist 中的距离是有序的,最小距离在第 1 列,最大距离在第 10 列。

"index" 中的索引引用 "y2xx" 中的行号,因此可以根据这些索引从 y2xx 列表中提取结果。

其中一行10的所有dist值都在0.75以上,我想取该行的最小距离,在"index"中找到对应的索引(应该在同一位置) 并从 y2xx.

中拉取相应的值

在连续距离小于 0.75 的地方,我想从那些 indexes/values 中随机抽样。

这是一个例子:

距离:

0.81  0.82  0.82  0.83  0.91  0.95  1.01  1.05  1.10  1.25
0.72  0.79  0.92  0.92  0.92  0.92  0.92  0.92  1.14  1.54
0.01  0.01  0.04  0.03  0.24  0.73  0.79  0.80  0.84  1.12

索引:

1233  3805  3813  5835  2765  5300  5482  7768  2072  4684
2588  2623  8184  3429  0397  2306  2441  3805  7163  8351
0057  1005  3919  6552  3410  9594  0100  0839  8676  9318

对于第 1 行,我想从 "y2xx" 的第 1233 行获取值。

对于第 2 行,我想从 "y2xx" 的第 2588 行获取值。

对于第 3 行,我想从 "y2xx" 的第 57、1005、3919、6552、3410 和 9594 行中随机抽取一个值。

我找到了一种方法,可以使用以下代码从行中的所有 10 个值中随机抽样:

results <- apply(matrix(y2yy[x2xx$index], ncol=10), 1, sample, 1)

但我想不出一种基于 "dist" 中的距离进行采样的方法。任何帮助将非常感激。

假设 x2xx 是一个包含元素 indexdist 的列表。 y2xx 是数值列表(为什么不是数值向量?谁知道?)。

首先让我们编写一个函数,在应用于行时执行您想要的操作 i.

getvalue <- function(i, x2xx) {
  dist.row <- x2xx$dist[i,]
  if(all(dist.row > 0.75)) {
    j <- which.min(dist.row)
   } else {
    sel <- which(dist.row <= 0.75)
    j <- sample(sel, 1)
   }

   ret <- x2xx$index[i,j]
}

现在剩下的就是将此函数应用于所有行:

sel.idx <- sapply(1:nrow(x2xx$index), getvalue, x2xx=x2xx)

并从 y2xx

中获取值
unlist(y2xx)[sel.idx]

您没有为 y2xx 提供示例,但这里是生成的 sel.idx:

> sel.idx
[1] 1233 2588   57