根据具有匹配结构的 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
是一个包含元素 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
我在 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
是一个包含元素 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