我在R中有一个特定的采样任务,无法解决。
我有一个20000x10的整数索引[1:20000,1:10]列表,称为“索引”,还有一个20000x10的数字距离[1:20000,1:10]列表,称为“ dist”-它们一起存储在一个名为“ x2xx”的列表。我还有一个单独的20000x1数字列表,称为“ y2xx”。我应该补充说,以dist为单位的距离是有序的,最小距离在第1列中,最大距离在第10列中。
“索引”中的索引引用了“ y2xx”中的行号,因此可以基于这些索引从y2xx列表中提取结果。
如果10行中的所有dist值都大于0.75,我想采用该行中的最小距离,在“ index”中找到相应的索引(应该在同一位置)并拉出y2xx中的对应值。
当行中的距离小于0.75时,我想从那些索引/值中随机采样。
这里是一个例子:
dist:
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”中距离的采样方法。任何帮助将非常感激。
答案 0 :(得分:2)
说x2xx
是一个包含元素index
和dist
的列表。 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